Note
Go to the end to download the full example code.
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)
14:54:44 INFO opendrift.models.basemodel:519: OpenDriftSimulation initialised (version 1.11.10 / v1.11.10-15-g65004d9)
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)
14:54:44 INFO opendrift.models.basemodel.environment:218: Adding a dynamical landmask with max. priority based on assumed maximum speed of 2.0 m/s. Adding a customised landmask may be faster...
14:54:50 INFO opendrift.models.basemodel.environment:245: Fallback values will be used for the following variables which have no readers:
14:54:50 INFO opendrift.models.basemodel.environment:248: sea_surface_height: 0.000000
14:54:50 INFO opendrift.models.basemodel.environment:248: x_wind: 0.000000
14:54:50 INFO opendrift.models.basemodel.environment:248: y_wind: 0.000000
14:54:50 INFO opendrift.models.basemodel.environment:248: upward_sea_water_velocity: 0.000000
14:54:50 INFO opendrift.models.basemodel.environment:248: ocean_vertical_diffusivity: 0.000000
14:54:50 INFO opendrift.models.basemodel.environment:248: sea_surface_wave_significant_height: 0.000000
14:54:50 INFO opendrift.models.basemodel.environment:248: sea_surface_wave_stokes_drift_x_velocity: 0.000000
14:54:50 INFO opendrift.models.basemodel.environment:248: sea_surface_wave_stokes_drift_y_velocity: 0.000000
14:54:50 INFO opendrift.models.basemodel.environment:248: sea_surface_wave_period_at_variance_spectral_density_maximum: 0.000000
14:54:50 INFO opendrift.models.basemodel.environment:248: sea_surface_wave_mean_period_from_variance_spectral_density_second_frequency_moment: 0.000000
14:54:50 INFO opendrift.models.basemodel.environment:248: sea_surface_swell_wave_to_direction: 0.000000
14:54:50 INFO opendrift.models.basemodel.environment:248: sea_surface_swell_wave_peak_period_from_variance_spectral_density: 0.000000
14:54:50 INFO opendrift.models.basemodel.environment:248: sea_surface_swell_wave_significant_height: 0.000000
14:54:50 INFO opendrift.models.basemodel.environment:248: sea_surface_wind_wave_to_direction: 0.000000
14:54:50 INFO opendrift.models.basemodel.environment:248: sea_surface_wind_wave_mean_period: 0.000000
14:54:50 INFO opendrift.models.basemodel.environment:248: sea_surface_wind_wave_significant_height: 0.000000
14:54:50 INFO opendrift.models.basemodel.environment:248: surface_downward_x_stress: 0.000000
14:54:50 INFO opendrift.models.basemodel.environment:248: surface_downward_y_stress: 0.000000
14:54:50 INFO opendrift.models.basemodel.environment:248: turbulent_kinetic_energy: 0.000000
14:54:50 INFO opendrift.models.basemodel.environment:248: turbulent_generic_length_scale: 0.000000
14:54:50 INFO opendrift.models.basemodel.environment:248: ocean_mixed_layer_thickness: 50.000000
14:54:50 INFO opendrift.models.basemodel.environment:248: sea_floor_depth_below_sea_level: 10000.000000
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})
14:54:51 INFO opendrift.models.basemodel:940: Using existing reader for land_binary_mask
14:54:51 INFO opendrift.models.basemodel:951: All points are in ocean
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 05:50:00 - step 1 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 06:00:00 - step 2 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 06:10:00 - step 3 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 06:20:00 - step 4 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 06:30:00 - step 5 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 06:40:00 - step 6 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 06:50:00 - step 7 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 07:00:00 - step 8 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 07:10:00 - step 9 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 07:20:00 - step 10 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 07:30:00 - step 11 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 07:40:00 - step 12 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 07:50:00 - step 13 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 08:00:00 - step 14 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 08:10:00 - step 15 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 08:20:00 - step 16 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 08:30:00 - step 17 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 08:40:00 - step 18 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 08:50:00 - step 19 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 09:00:00 - step 20 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 09:10:00 - step 21 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 09:20:00 - step 22 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 09:30:00 - step 23 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 09:40:00 - step 24 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 09:50:00 - step 25 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 10:00:00 - step 26 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 10:10:00 - step 27 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 10:20:00 - step 28 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 10:30:00 - step 29 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 10:40:00 - step 30 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 10:50:00 - step 31 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 11:00:00 - step 32 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 11:10:00 - step 33 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 11:20:00 - step 34 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 11:30:00 - step 35 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 11:40:00 - step 36 of 45 - 2000 active elements (0 deactivated)
14:54:51 INFO opendrift.models.basemodel:2042: 2015-06-10 11:50:00 - step 37 of 45 - 2000 active elements (0 deactivated)
14:54:52 INFO opendrift.models.basemodel:2042: 2015-06-10 12:00:00 - step 38 of 45 - 2000 active elements (0 deactivated)
14:54:52 INFO opendrift.models.basemodel:2042: 2015-06-10 12:10:00 - step 39 of 45 - 2000 active elements (0 deactivated)
14:54:52 INFO opendrift.models.basemodel:2042: 2015-06-10 12:20:00 - step 40 of 45 - 2000 active elements (0 deactivated)
14:54:52 INFO opendrift.models.basemodel:2042: 2015-06-10 12:30:00 - step 41 of 45 - 2000 active elements (0 deactivated)
14:54:52 INFO opendrift.models.basemodel:2042: 2015-06-10 12:40:00 - step 42 of 45 - 2000 active elements (0 deactivated)
14:54:52 INFO opendrift.models.basemodel:2042: 2015-06-10 12:50:00 - step 43 of 45 - 2000 active elements (0 deactivated)
14:54:52 INFO opendrift.models.basemodel:2042: 2015-06-10 13:00:00 - step 44 of 45 - 2000 active elements (0 deactivated)
14:54:52 INFO opendrift.models.basemodel:2042: 2015-06-10 13:10:00 - step 45 of 45 - 2000 active elements (0 deactivated)
14:54:52 WARNING opendrift.models.basemodel:2415: Plotting fast. This will make your plots less accurate.
/opt/conda/envs/opendrift/lib/python3.11/site-packages/cartopy/mpl/geoaxes.py:1683: UserWarning: No data for colormapping provided via 'c'. Parameters 'cmap' will be ignored
result = super().scatter(*args, **kwargs)
14:54:54 INFO opendrift.models.basemodel:4612: Saving animation to /root/project/docs/source/gallery/animations/example_current_from_drifter_0.gif...
14:55:17 INFO opendrift.models.basemodel:3041: Time to make animation: 0:00:24.810876
![../_images/example_current_from_drifter_0.gif](../_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, drifter={
'lon': drifterlons, 'lat': drifterlats,
'time': driftertimes, 'linewidth': 2, 'color': 'r'})
![OpenDrift - OceanDrift 2015-06-10 05:50 to 2015-06-10 13:20 UTC (46 steps)](../_images/sphx_glr_example_current_from_drifter_001.png)
14:55:17 WARNING opendrift.models.basemodel:2415: Plotting fast. This will make your plots less accurate.
(<GeoAxes: title={'center': 'OpenDrift - OceanDrift\n2015-06-10 05:50 to 2015-06-10 13:20 UTC (46 steps)'}>, <Figure size 714.948x1100 with 1 Axes>)
Total running time of the script: (0 minutes 48.090 seconds)