Note
Go to the end to download the full example code.
Show dominating source
import os
from datetime import datetime
import xarray as xr
import opendrift
from opendrift.models.oceandrift import OceanDrift
of = 'test.nc'
Seed elements at 5 different locations/longitudes
lons = [4, 4.2, 4.3, 4.32, 4.6]
t = datetime.now()
o = OceanDrift(loglevel=20)
o.set_config('environment:constant:y_sea_water_velocity', .1)
for i, lon in enumerate(lons):
o.seed_elements(lon=lon, lat=60, radius=3000, number=2000, time=t, origin_marker_name='Lon %f' % lon)
o.run(steps=15, outfile=of)
13:21:37 INFO opendrift:513: OpenDriftSimulation initialised (version 1.14.2 / v1.14.2-79-ga5f3ce3)
13:21:37 INFO opendrift.models.basemodel.environment:206: Adding a global landmask from GSHHG
13:21:41 INFO opendrift.models.basemodel.environment:229: Fallback values will be used for the following variables which have no readers:
13:21:41 INFO opendrift.models.basemodel.environment:232: x_sea_water_velocity: 0.000000
13:21:41 INFO opendrift.models.basemodel.environment:232: sea_surface_height: 0.000000
13:21:41 INFO opendrift.models.basemodel.environment:232: x_wind: 0.000000
13:21:41 INFO opendrift.models.basemodel.environment:232: y_wind: 0.000000
13:21:41 INFO opendrift.models.basemodel.environment:232: upward_sea_water_velocity: 0.000000
13:21:41 INFO opendrift.models.basemodel.environment:232: ocean_vertical_diffusivity: 0.000000
13:21:41 INFO opendrift.models.basemodel.environment:232: sea_surface_wave_significant_height: 0.000000
13:21:41 INFO opendrift.models.basemodel.environment:232: sea_surface_wave_stokes_drift_x_velocity: 0.000000
13:21:41 INFO opendrift.models.basemodel.environment:232: sea_surface_wave_stokes_drift_y_velocity: 0.000000
13:21:41 INFO opendrift.models.basemodel.environment:232: ocean_mixed_layer_thickness: 50.000000
13:21:41 INFO opendrift.models.basemodel.environment:232: sea_floor_depth_below_sea_level: 10000.000000
13:21:41 INFO opendrift:1722: Skipping environment variable ocean_vertical_diffusivity because of condition ['drift:vertical_mixing', 'is', False]
13:21:41 INFO opendrift:1722: Skipping environment variable ocean_mixed_layer_thickness because of condition ['drift:vertical_mixing', 'is', False]
13:21:41 INFO opendrift:889: Using existing reader for land_binary_mask
13:21:41 INFO opendrift:918: All points are in ocean
13:21:41 INFO opendrift:1948: Storing previous position of elements for coastline interaction
13:21:41 INFO opendrift:2009: 2025-07-01 13:21:37.371474 - step 1 of 15 - 10000 active elements (0 deactivated)
13:21:41 INFO opendrift:2009: 2025-07-01 14:21:37.371474 - step 2 of 15 - 10000 active elements (0 deactivated)
13:21:42 INFO opendrift:2009: 2025-07-01 15:21:37.371474 - step 3 of 15 - 10000 active elements (0 deactivated)
13:21:42 INFO opendrift:2009: 2025-07-01 16:21:37.371474 - step 4 of 15 - 10000 active elements (0 deactivated)
13:21:42 INFO opendrift:2009: 2025-07-01 17:21:37.371474 - step 5 of 15 - 10000 active elements (0 deactivated)
13:21:42 INFO opendrift:2009: 2025-07-01 18:21:37.371474 - step 6 of 15 - 10000 active elements (0 deactivated)
13:21:42 INFO opendrift:2009: 2025-07-01 19:21:37.371474 - step 7 of 15 - 10000 active elements (0 deactivated)
13:21:42 INFO opendrift:2009: 2025-07-01 20:21:37.371474 - step 8 of 15 - 10000 active elements (0 deactivated)
13:21:42 INFO opendrift:2009: 2025-07-01 21:21:37.371474 - step 9 of 15 - 10000 active elements (0 deactivated)
13:21:42 INFO opendrift:2009: 2025-07-01 22:21:37.371474 - step 10 of 15 - 10000 active elements (0 deactivated)
13:21:42 INFO opendrift:2009: 2025-07-01 23:21:37.371474 - step 11 of 15 - 10000 active elements (0 deactivated)
13:21:42 INFO opendrift:2009: 2025-07-02 00:21:37.371474 - step 12 of 15 - 10000 active elements (0 deactivated)
13:21:42 INFO opendrift:2009: 2025-07-02 01:21:37.371474 - step 13 of 15 - 10000 active elements (0 deactivated)
13:21:42 INFO opendrift:2009: 2025-07-02 02:21:37.371474 - step 14 of 15 - 10000 active elements (0 deactivated)
13:21:42 INFO opendrift:2009: 2025-07-02 03:21:37.371474 - step 15 of 15 - 10000 active elements (0 deactivated)
Calculate spatial density of elements at 1500m grid spacing
d = o.get_histogram(pixelsize_m=1500, weights=None)
dom = d.argmax(dim='origin_marker', skipna=True)
dom = dom.where(d.sum(dim='origin_marker')>0)
dom.name = 'Dominating source'
13:21:43 INFO opendrift:3807: calculating for origin_marker 0...
13:21:43 INFO opendrift:3807: calculating for origin_marker 1...
13:21:43 INFO opendrift:3807: calculating for origin_marker 2...
13:21:43 INFO opendrift:3807: calculating for origin_marker 3...
13:21:43 INFO opendrift:3807: calculating for origin_marker 4...
Show which of the 5 sources are dominating within each grid cell
o.animation(background=dom, show_elements=False, bgalpha=1,
legend=list(o.origin_marker.values()), colorbar=False, vmin=0, vmax=4)
/opt/conda/envs/opendrift/lib/python3.13/site-packages/cartopy/mpl/geoaxes.py:1692: UserWarning: No data for colormapping provided via 'c'. Parameters 'vmin', 'vmax' will be ignored
result = super().scatter(*args, **kwargs)
13:21:54 INFO opendrift:4527: Saving animation to /root/project/docs/source/gallery/animations/example_dominating_0.gif...
13:22:04 INFO opendrift:2968: Time to make animation: 0:00:20.494579

os.remove(of)
Total running time of the script: (0 minutes 33.383 seconds)