Current from drifter

from datetime import datetime, timedelta
from opendrift.readers import reader_current_from_drifter
from opendrift.models.oceandrift import OceanDrift


o = OceanDrift(loglevel=20)
o.set_config('environment:fallback:land_binary_mask', 0)

Out:

13:43:51 INFO    opendrift.models.basemodel: OpenDriftSimulation initialised (version 1.7.1 / v1.7.1-87-g074c1d2)

We make a reader which reconstructs the ocean current from observed time series of a drifter This is actual data of SLDMB/Code drifter as used in this study: Jones, C.E., Dagestad, K.-F., Breivik, O., Holt, B., Rohrs, J., Christensen, K.H., Espeseth, M.M., Brekke, C., Skrunes, S. (2016): Measurement and modeling of oil slick transport. Journal of Geophysical Research - Oceans, Volume 121, Issue 10, October 2016, Pages 7759-7775. DOI: 10.1002/2016JC012113.

drifterlons = [2.407376, 2.405140, 2.403248, 2.401872, 2.400152, 2.398518, 2.397056, 2.395766, 2.394476, 2.393358, 2.392584, 2.391810, 2.390606, 2.389316, 2.388628, 2.388370, 2.387940, 2.387510, 2.387338, 2.387166, 2.387252, 2.387338, 2.387682, 2.387854, 2.388284, 2.388628, 2.389230, 2.390004, 2.390434, 2.390692, 2.391380, 2.391896, 2.392068, 2.392154, 2.392068, 2.391896, 2.391896, 2.391896, 2.391638, 2.391380, 2.391208, 2.391036, 2.390692, 2.390090, 2.389660, 2.389058, 2.388628]
drifterlats = [60.034740, 60.033880, 60.033106, 60.032246, 60.031300, 60.030182, 60.028892, 60.027602, 60.026656, 60.025538, 60.024420, 60.023388, 60.022442, 60.021496, 60.020378, 60.019346, 60.018572, 60.017626, 60.016852, 60.016164, 60.015734, 60.015304, 60.014616, 60.014100, 60.013670, 60.013412, 60.013240, 60.013068, 60.013154, 60.013412, 60.013584, 60.013842, 60.014186, 60.014616, 60.015218, 60.015820, 60.016594, 60.017454, 60.018400, 60.019346, 60.020464, 60.021410, 60.022442, 60.023474, 60.024678, 60.025882, 60.026914]
drifterlats = drifterlats[::-1]
drifterlons = drifterlons[::-1]
driftertimes = [datetime(2015, 6, 10, 5, 50) +
    timedelta(minutes=10)*i for i in range(len(drifterlons))]

r = reader_current_from_drifter.Reader(
        lons=drifterlons, lats=drifterlats, times=driftertimes)
o.add_reader(r)

We seed elements within polygon, as could have been extracted from remote sensing imagery

lons = [2.39, 2.391, 2.392, 2.393, 2.394, 2.393, 2.392, 2.391, 2.39]
lats = [60.02, 60.02, 60.019, 60.02, 60.021, 60.022, 60.021, 60.021, 60.02]
o.seed_within_polygon(lons=lons, lats=lats,
                      number=2000, time=r.start_time)

Finally running simulation

o.run(end_time=r.end_time, time_step=r.time_step)

o.animation(buffer=.01, fast=True, drifter={'time': driftertimes, 'lon': drifterlons, 'lat': drifterlats,
    'label': 'CODE Drifter', 'color': 'b', 'linewidth': 2, 'markersize': 40})

Out:

13:43:51 INFO    opendrift.models.basemodel: Fallback values will be used for the following variables which have no readers:
13:43:51 INFO    opendrift.models.basemodel:    x_wind: 0.000000
13:43:51 INFO    opendrift.models.basemodel:    y_wind: 0.000000
13:43:51 INFO    opendrift.models.basemodel:    upward_sea_water_velocity: 0.000000
13:43:51 INFO    opendrift.models.basemodel:    ocean_vertical_diffusivity: 0.000000
13:43:51 INFO    opendrift.models.basemodel:    sea_surface_wave_significant_height: 0.000000
13:43:51 INFO    opendrift.models.basemodel:    sea_surface_wave_stokes_drift_x_velocity: 0.000000
13:43:51 INFO    opendrift.models.basemodel:    sea_surface_wave_stokes_drift_y_velocity: 0.000000
13:43:51 INFO    opendrift.models.basemodel:    sea_surface_wave_period_at_variance_spectral_density_maximum: 0.000000
13:43:51 INFO    opendrift.models.basemodel:    sea_surface_wave_mean_period_from_variance_spectral_density_second_frequency_moment: 0.000000
13:43:51 INFO    opendrift.models.basemodel:    surface_downward_x_stress: 0.000000
13:43:51 INFO    opendrift.models.basemodel:    surface_downward_y_stress: 0.000000
13:43:51 INFO    opendrift.models.basemodel:    turbulent_kinetic_energy: 0.000000
13:43:51 INFO    opendrift.models.basemodel:    turbulent_generic_length_scale: 0.000000
13:43:51 INFO    opendrift.models.basemodel:    sea_floor_depth_below_sea_level: 10000.000000
13:43:51 INFO    opendrift.models.basemodel: No land reader added, making a temporary landmask reader
13:43:51 INFO    opendrift_landmask_data.mask: locking landmask for generation..
13:43:51 INFO    opendrift_landmask_data.mask: decompressing memmap landmask to /tmp/landmask/mask.dat..
13:44:05 INFO    opendrift_landmask_data.mask: landmask generated
13:44:09 INFO    opendrift.models.basemodel: OpenDriftSimulation initialised (version 1.7.1 / v1.7.1-87-g074c1d2)
13:44:09 INFO    opendrift.models.basemodel: All points are in ocean
13:44:09 INFO    opendrift.models.basemodel: 2015-06-10 05:50:00 - step 1 of 45 - 2000 active elements (0 deactivated)
13:44:09 INFO    opendrift.models.basemodel: 2015-06-10 06:00:00 - step 2 of 45 - 2000 active elements (0 deactivated)
13:44:09 INFO    opendrift.models.basemodel: 2015-06-10 06:10:00 - step 3 of 45 - 2000 active elements (0 deactivated)
13:44:09 INFO    opendrift.models.basemodel: 2015-06-10 06:20:00 - step 4 of 45 - 2000 active elements (0 deactivated)
13:44:09 INFO    opendrift.models.basemodel: 2015-06-10 06:30:00 - step 5 of 45 - 2000 active elements (0 deactivated)
13:44:09 INFO    opendrift.models.basemodel: 2015-06-10 06:40:00 - step 6 of 45 - 2000 active elements (0 deactivated)
13:44:09 INFO    opendrift.models.basemodel: 2015-06-10 06:50:00 - step 7 of 45 - 2000 active elements (0 deactivated)
13:44:09 INFO    opendrift.models.basemodel: 2015-06-10 07:00:00 - step 8 of 45 - 2000 active elements (0 deactivated)
13:44:09 INFO    opendrift.models.basemodel: 2015-06-10 07:10:00 - step 9 of 45 - 2000 active elements (0 deactivated)
13:44:09 INFO    opendrift.models.basemodel: 2015-06-10 07:20:00 - step 10 of 45 - 2000 active elements (0 deactivated)
13:44:09 INFO    opendrift.models.basemodel: 2015-06-10 07:30:00 - step 11 of 45 - 2000 active elements (0 deactivated)
13:44:09 INFO    opendrift.models.basemodel: 2015-06-10 07:40:00 - step 12 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 07:50:00 - step 13 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 08:00:00 - step 14 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 08:10:00 - step 15 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 08:20:00 - step 16 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 08:30:00 - step 17 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 08:40:00 - step 18 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 08:50:00 - step 19 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 09:00:00 - step 20 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 09:10:00 - step 21 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 09:20:00 - step 22 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 09:30:00 - step 23 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 09:40:00 - step 24 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 09:50:00 - step 25 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 10:00:00 - step 26 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 10:10:00 - step 27 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 10:20:00 - step 28 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 10:30:00 - step 29 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 10:40:00 - step 30 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 10:50:00 - step 31 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 11:00:00 - step 32 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 11:10:00 - step 33 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 11:20:00 - step 34 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 11:30:00 - step 35 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 11:40:00 - step 36 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 11:50:00 - step 37 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 12:00:00 - step 38 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 12:10:00 - step 39 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 12:20:00 - step 40 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 12:30:00 - step 41 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 12:40:00 - step 42 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 12:50:00 - step 43 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 13:00:00 - step 44 of 45 - 2000 active elements (0 deactivated)
13:44:10 INFO    opendrift.models.basemodel: 2015-06-10 13:10:00 - step 45 of 45 - 2000 active elements (0 deactivated)
13:44:10 WARNING opendrift.models.basemodel: Plotting fast. This will make your plots less accurate.
13:44:12 INFO    opendrift.models.basemodel: Saving animation to /root/project/docs/source/gallery/animations/example_current_from_drifter_0.gif...
13:44:12 INFO    opendrift.models.basemodel: Making animated gif...
MovieWriter imagemagick unavailable; using Pillow instead.
../_images/example_current_from_drifter_0.gif

Drifter track is shown in red, and simulated trajectories are shown in gray. Oil spill is displaced relative to drifter, but drifter current is assumed to be spatially homogeneous.

o.plot(buffer=.01, fast=True, trajectory_dict={
        'lon': drifterlons, 'lat': drifterlats,
        'time': driftertimes, 'linestyle': 'r-'})
OpenDrift - OceanDrift 2015-06-10 05:50 to 2015-06-10 13:20 UTC (46 steps)

Out:

13:44:25 WARNING opendrift.models.basemodel: Plotting fast. This will make your plots less accurate.

(<GeoAxesSubplot:title={'center':'OpenDrift - OceanDrift\n2015-06-10 05:50 to 2015-06-10 13:20 UTC (46 steps)'}>, <module 'matplotlib.pyplot' from '/opt/conda/envs/opendrift/lib/python3.9/site-packages/matplotlib/pyplot.py'>)

Total running time of the script: ( 0 minutes 40.463 seconds)

Gallery generated by Sphinx-Gallery