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)
17:13:02 INFO opendrift:513: OpenDriftSimulation initialised (version 1.14.2 / v1.14.2-88-gf09b7bd)
17:13:02 INFO opendrift.models.basemodel.environment:206: Adding a global landmask from GSHHG
17:13:06 INFO opendrift.models.basemodel.environment:229: Fallback values will be used for the following variables which have no readers:
17:13:06 INFO opendrift.models.basemodel.environment:232: x_sea_water_velocity: 0.000000
17:13:06 INFO opendrift.models.basemodel.environment:232: sea_surface_height: 0.000000
17:13:06 INFO opendrift.models.basemodel.environment:232: x_wind: 0.000000
17:13:06 INFO opendrift.models.basemodel.environment:232: y_wind: 0.000000
17:13:06 INFO opendrift.models.basemodel.environment:232: upward_sea_water_velocity: 0.000000
17:13:06 INFO opendrift.models.basemodel.environment:232: ocean_vertical_diffusivity: 0.000000
17:13:06 INFO opendrift.models.basemodel.environment:232: sea_surface_wave_significant_height: 0.000000
17:13:06 INFO opendrift.models.basemodel.environment:232: sea_surface_wave_stokes_drift_x_velocity: 0.000000
17:13:06 INFO opendrift.models.basemodel.environment:232: sea_surface_wave_stokes_drift_y_velocity: 0.000000
17:13:06 INFO opendrift.models.basemodel.environment:232: ocean_mixed_layer_thickness: 50.000000
17:13:06 INFO opendrift.models.basemodel.environment:232: sea_floor_depth_below_sea_level: 10000.000000
17:13:06 INFO opendrift:1732: Skipping environment variable ocean_vertical_diffusivity because of condition ['drift:vertical_mixing', 'is', False]
17:13:06 INFO opendrift:1732: Skipping environment variable ocean_mixed_layer_thickness because of condition ['drift:vertical_mixing', 'is', False]
17:13:06 INFO opendrift:1743: Storing previous values of element property lon because of condition (('general:coastline_action', 'in', ['stranding', 'previous']), 'or', ('general:seafloor_action', 'in', ['previous']))
17:13:06 INFO opendrift:1743: Storing previous values of element property lat because of condition (('general:coastline_action', 'in', ['stranding', 'previous']), 'or', ('general:seafloor_action', 'in', ['previous']))
17:13:06 INFO opendrift:1751: Storing previous values of environment variable sea_surface_height because of condition ['drift:vertical_advection', 'is', True]
17:13:06 INFO opendrift:899: Using existing reader for land_binary_mask
17:13:06 INFO opendrift:928: All points are in ocean
17:13:06 INFO opendrift:2035: 2025-07-11 17:13:01.905949 - step 1 of 15 - 10000 active elements (0 deactivated)
17:13:06 INFO opendrift:2035: 2025-07-11 18:13:01.905949 - step 2 of 15 - 10000 active elements (0 deactivated)
17:13:06 INFO opendrift:2035: 2025-07-11 19:13:01.905949 - step 3 of 15 - 10000 active elements (0 deactivated)
17:13:06 INFO opendrift:2035: 2025-07-11 20:13:01.905949 - step 4 of 15 - 10000 active elements (0 deactivated)
17:13:06 INFO opendrift:2035: 2025-07-11 21:13:01.905949 - step 5 of 15 - 10000 active elements (0 deactivated)
17:13:07 INFO opendrift:2035: 2025-07-11 22:13:01.905949 - step 6 of 15 - 10000 active elements (0 deactivated)
17:13:07 INFO opendrift:2035: 2025-07-11 23:13:01.905949 - step 7 of 15 - 10000 active elements (0 deactivated)
17:13:07 INFO opendrift:2035: 2025-07-12 00:13:01.905949 - step 8 of 15 - 10000 active elements (0 deactivated)
17:13:07 INFO opendrift:2035: 2025-07-12 01:13:01.905949 - step 9 of 15 - 10000 active elements (0 deactivated)
17:13:07 INFO opendrift:2035: 2025-07-12 02:13:01.905949 - step 10 of 15 - 10000 active elements (0 deactivated)
17:13:07 INFO opendrift:2035: 2025-07-12 03:13:01.905949 - step 11 of 15 - 10000 active elements (0 deactivated)
17:13:07 INFO opendrift:2035: 2025-07-12 04:13:01.905949 - step 12 of 15 - 10000 active elements (0 deactivated)
17:13:07 INFO opendrift:2035: 2025-07-12 05:13:01.905949 - step 13 of 15 - 10000 active elements (0 deactivated)
17:13:07 INFO opendrift:2035: 2025-07-12 06:13:01.905949 - step 14 of 15 - 10000 active elements (0 deactivated)
17:13:07 INFO opendrift:2035: 2025-07-12 07:13:01.905949 - 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'
17:13:09 INFO opendrift:3833: calculating for origin_marker 0...
17:13:09 INFO opendrift:3833: calculating for origin_marker 1...
17:13:09 INFO opendrift:3833: calculating for origin_marker 2...
17:13:09 INFO opendrift:3833: calculating for origin_marker 3...
17:13:09 INFO opendrift:3833: 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)
17:13:23 INFO opendrift:4553: Saving animation to /root/project/docs/source/gallery/animations/example_dominating_0.gif...
17:13:37 INFO opendrift:2994: Time to make animation: 0:00:27.959040

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