Note
Go to the end to download the full example code.
Oil vertical mixing
import os
from datetime import timedelta
from opendrift.readers import reader_netCDF_CF_generic
from opendrift.models.openoil import OpenOil
o = OpenOil(loglevel=20) # Set loglevel to 0 for debug information
ncfile = 'oilmixing.nc'
import_file = False # Set to True to import previous run
if import_file is True:
o.io_import_file(ncfile)
else:
reader_arome = reader_netCDF_CF_generic.Reader('https://thredds.met.no/thredds/dodsC/mepslatest/meps_lagged_6_h_latest_2_5km_latest.nc')
reader_norkyst = reader_netCDF_CF_generic.Reader('https://thredds.met.no/thredds/dodsC/fou-hi/norkystv3_800m_m00_be')
o.add_reader([reader_norkyst, reader_arome])
# Adjusting some configuration
#o.set_config('vertical_mixing:diffusivitymodel', 'windspeed_Sundby1983')
# Seed oil elements at defined position and time
o.seed_elements(lon=4.9, lat=62.1, z=0, radius=1000, number=5000,
time=reader_arome.start_time, oil_type='GENERIC DIESEL')
# Running model
o.run(end_time=reader_arome.start_time + timedelta(hours=12),
time_step=900, time_step_output=1800, outfile=ncfile)
15:34:52 INFO opendrift:569: OpenDriftSimulation initialised (version 1.14.11 / v1.14.12-32-g22db1c0)
15:34:52 INFO opendrift.readers:67: Opening file with xr.open_dataset
15:34:54 INFO opendrift.readers.reader_netCDF_CF_generic:340: Detected dimensions: {'time': 'time', 'x': 'x', 'y': 'y'}
15:34:54 INFO opendrift.readers:67: Opening file with xr.open_dataset
15:34:56 INFO opendrift.readers.reader_netCDF_CF_generic:340: Detected dimensions: {'x': 'X', 'y': 'Y', 'z': 'depth', 'time': 'time'}
15:34:56 INFO opendrift.readers.basereader:175: Variable x_sea_water_velocity will be rotated from eastward_sea_water_velocity
15:34:56 INFO opendrift.readers.basereader:175: Variable y_sea_water_velocity will be rotated from northward_sea_water_velocity
15:34:56 INFO opendrift.readers.basereader:175: Variable x_wind will be rotated from eastward_wind
15:34:56 INFO opendrift.readers.basereader:175: Variable y_wind will be rotated from northward_wind
15:34:56 INFO opendrift.models.openoil.adios.dirjs:86: Querying ADIOS database for oil: GENERIC DIESEL
15:34:56 INFO opendrift.models.openoil.openoil:1731: Using density 855.84763 and viscosity 8.644570579524577e-06 of oiltype GENERIC DIESEL
15:34:56 INFO opendrift.models.basemodel.environment:203: Adding a global landmask from GSHHG
15:35:02 INFO opendrift.models.basemodel.environment:227: Fallback values will be used for the following variables which have no readers:
15:35:02 INFO opendrift.models.basemodel.environment:230: sea_surface_wave_significant_height: 0.000000
15:35:02 INFO opendrift.models.basemodel.environment:230: sea_surface_wave_stokes_drift_x_velocity: 0.000000
15:35:02 INFO opendrift.models.basemodel.environment:230: sea_surface_wave_stokes_drift_y_velocity: 0.000000
15:35:02 INFO opendrift.models.basemodel.environment:230: sea_surface_wave_period_at_variance_spectral_density_maximum: 0.000000
15:35:02 INFO opendrift.models.basemodel.environment:230: sea_surface_wave_mean_period_from_variance_spectral_density_second_frequency_moment: 0.000000
15:35:02 INFO opendrift.models.basemodel.environment:230: sea_ice_area_fraction: 0.000000
15:35:02 INFO opendrift.models.basemodel.environment:230: sea_ice_x_velocity: 0.000000
15:35:02 INFO opendrift.models.basemodel.environment:230: sea_ice_y_velocity: 0.000000
15:35:02 INFO opendrift.models.basemodel.environment:230: horizontal_diffusivity: 0.000000
15:35:02 INFO opendrift.models.basemodel.environment:230: ocean_mixed_layer_thickness: 50.000000
15:35:02 INFO opendrift:1910: Skipping environment variable upward_sea_water_velocity because of condition ['drift:vertical_advection', 'is', False]
15:35:02 INFO opendrift:1921: Storing previous values of element property lon because of condition (('general:coastline_action', 'in', ['stranding', 'previous']), 'or', ('general:seafloor_action', 'in', ['previous']))
15:35:02 INFO opendrift:1921: Storing previous values of element property lat because of condition (('general:coastline_action', 'in', ['stranding', 'previous']), 'or', ('general:seafloor_action', 'in', ['previous']))
15:35:02 INFO opendrift:958: Using existing reader for land_binary_mask to move elements to ocean
15:35:02 INFO opendrift:989: All points are in ocean
15:35:02 INFO opendrift.models.openoil.openoil:697: Oil-water surface tension is 0.030314 Nm
15:35:02 INFO opendrift.models.openoil.openoil:710: Max water fraction not available for GENERIC DIESEL, using default
15:35:02 INFO opendrift:2237: 2026-10-05 13:00:00 - step 1 of 48 - 5000 active elements (0 deactivated)
15:35:13 INFO opendrift:2237: 2026-10-05 13:15:00 - step 2 of 48 - 5000 active elements (0 deactivated)
15:35:25 INFO opendrift:2237: 2026-10-05 13:30:00 - step 3 of 48 - 5000 active elements (0 deactivated)
15:35:26 INFO opendrift:2237: 2026-10-05 13:45:00 - step 4 of 48 - 5000 active elements (0 deactivated)
15:35:26 INFO opendrift:2237: 2026-10-05 14:00:00 - step 5 of 48 - 5000 active elements (0 deactivated)
15:35:26 INFO opendrift:2237: 2026-10-05 14:15:00 - step 6 of 48 - 5000 active elements (0 deactivated)
15:35:32 INFO opendrift:2237: 2026-10-05 14:30:00 - step 7 of 48 - 5000 active elements (0 deactivated)
15:35:32 INFO opendrift:2237: 2026-10-05 14:45:00 - step 8 of 48 - 5000 active elements (0 deactivated)
15:35:33 INFO opendrift:2237: 2026-10-05 15:00:00 - step 9 of 48 - 5000 active elements (0 deactivated)
15:35:33 INFO opendrift:2237: 2026-10-05 15:15:00 - step 10 of 48 - 5000 active elements (0 deactivated)
15:35:42 INFO opendrift:2237: 2026-10-05 15:30:00 - step 11 of 48 - 5000 active elements (0 deactivated)
15:35:42 INFO opendrift:2237: 2026-10-05 15:45:00 - step 12 of 48 - 5000 active elements (0 deactivated)
15:35:42 INFO opendrift:2237: 2026-10-05 16:00:00 - step 13 of 48 - 5000 active elements (0 deactivated)
15:35:43 INFO opendrift:2237: 2026-10-05 16:15:00 - step 14 of 48 - 5000 active elements (0 deactivated)
15:35:49 INFO opendrift:2237: 2026-10-05 16:30:00 - step 15 of 48 - 5000 active elements (0 deactivated)
15:35:50 INFO opendrift:2237: 2026-10-05 16:45:00 - step 16 of 48 - 5000 active elements (0 deactivated)
15:35:50 INFO opendrift:2237: 2026-10-05 17:00:00 - step 17 of 48 - 5000 active elements (0 deactivated)
15:35:50 INFO opendrift:2237: 2026-10-05 17:15:00 - step 18 of 48 - 5000 active elements (0 deactivated)
15:35:53 INFO opendrift:2237: 2026-10-05 17:30:00 - step 19 of 48 - 5000 active elements (0 deactivated)
15:35:54 INFO opendrift:2237: 2026-10-05 17:45:00 - step 20 of 48 - 5000 active elements (0 deactivated)
15:35:54 INFO opendrift:2237: 2026-10-05 18:00:00 - step 21 of 48 - 5000 active elements (0 deactivated)
15:35:54 INFO opendrift:2237: 2026-10-05 18:15:00 - step 22 of 48 - 5000 active elements (0 deactivated)
15:35:59 INFO opendrift:2237: 2026-10-05 18:30:00 - step 23 of 48 - 5000 active elements (0 deactivated)
15:36:00 INFO opendrift:2237: 2026-10-05 18:45:00 - step 24 of 48 - 5000 active elements (0 deactivated)
15:36:00 INFO opendrift:2237: 2026-10-05 19:00:00 - step 25 of 48 - 5000 active elements (0 deactivated)
15:36:00 INFO opendrift:2237: 2026-10-05 19:15:00 - step 26 of 48 - 5000 active elements (0 deactivated)
15:36:04 INFO opendrift:2237: 2026-10-05 19:30:00 - step 27 of 48 - 5000 active elements (0 deactivated)
15:36:04 INFO opendrift:2237: 2026-10-05 19:45:00 - step 28 of 48 - 4999 active elements (1 deactivated)
15:36:04 INFO opendrift:2237: 2026-10-05 20:00:00 - step 29 of 48 - 4999 active elements (1 deactivated)
15:36:05 INFO opendrift:2237: 2026-10-05 20:15:00 - step 30 of 48 - 4998 active elements (2 deactivated)
15:36:09 INFO opendrift:2237: 2026-10-05 20:30:00 - step 31 of 48 - 4998 active elements (2 deactivated)
15:36:09 INFO opendrift:2237: 2026-10-05 20:45:00 - step 32 of 48 - 4995 active elements (5 deactivated)
15:36:09 INFO opendrift:2237: 2026-10-05 21:00:00 - step 33 of 48 - 4995 active elements (5 deactivated)
15:36:09 INFO opendrift:2237: 2026-10-05 21:15:00 - step 34 of 48 - 4992 active elements (8 deactivated)
15:36:13 INFO opendrift:2237: 2026-10-05 21:30:00 - step 35 of 48 - 4992 active elements (8 deactivated)
15:36:13 INFO opendrift:2237: 2026-10-05 21:45:00 - step 36 of 48 - 4991 active elements (9 deactivated)
15:36:14 INFO opendrift:2237: 2026-10-05 22:00:00 - step 37 of 48 - 4991 active elements (9 deactivated)
15:36:14 INFO opendrift:2237: 2026-10-05 22:15:00 - step 38 of 48 - 4990 active elements (10 deactivated)
15:36:20 INFO opendrift:2237: 2026-10-05 22:30:00 - step 39 of 48 - 4987 active elements (13 deactivated)
15:36:20 INFO opendrift:2237: 2026-10-05 22:45:00 - step 40 of 48 - 4987 active elements (13 deactivated)
15:36:20 INFO opendrift:2237: 2026-10-05 23:00:00 - step 41 of 48 - 4986 active elements (14 deactivated)
15:36:20 INFO opendrift:2237: 2026-10-05 23:15:00 - step 42 of 48 - 4985 active elements (15 deactivated)
15:36:24 INFO opendrift:2237: 2026-10-05 23:30:00 - step 43 of 48 - 4985 active elements (15 deactivated)
15:36:24 INFO opendrift:2237: 2026-10-05 23:45:00 - step 44 of 48 - 4985 active elements (15 deactivated)
15:36:24 INFO opendrift:2237: 2026-10-06 00:00:00 - step 45 of 48 - 4985 active elements (15 deactivated)
15:36:24 INFO opendrift:2237: 2026-10-06 00:15:00 - step 46 of 48 - 4985 active elements (15 deactivated)
15:36:26 INFO opendrift:2237: 2026-10-06 00:30:00 - step 47 of 48 - 4983 active elements (17 deactivated)
15:36:27 INFO opendrift:2237: 2026-10-06 00:45:00 - step 48 of 48 - 4983 active elements (17 deactivated)
Print and plot results
print(o)
o.plot(linecolor='z', fast=True)
o.plot_property('z')
o.plot_oil_budget()
o.animation(fast=True)
o.animate_vertical_distribution()
os.remove(ncfile) # cleaning up
===========================
--------------------
Reader performance:
--------------------
https://thredds.met.no/thredds/dodsC/fou-hi/norkystv3_800m_m00_be
0:01:18.8 total
0:00:00.0 preparing
0:01:17.9 reading
0:00:02.9 interpolation
0:00:00.0 interpolation_time
0:00:00.8 rotating vectors
0:00:00.0 masking
--------------------
https://thredds.met.no/thredds/dodsC/mepslatest/meps_lagged_6_h_latest_2_5km_latest.nc
--------------------
global_landmask
0:00:00.0 total
0:00:00.0 preparing
0:00:00.0 reading
0:00:00.0 masking
--------------------
Performance:
1:34.4 total time
9.5 configuration
0.0 preparing main loop
0.0 moving elements to ocean
1:24.9 main loop
3.1 updating elements
0.2 oil weathering
0.0 updating viscosities
0.0 updating densities
0.1 evaporation
0.0 emulsification
0.0 dispersion
2.5 vertical mixing
0.0 cleaning up
--------------------
===========================
Model: OpenOil (OpenDrift version 1.14.11)
4982 active Oil particles (18 deactivated, 0 scheduled)
-------------------
Environment variables:
-----
ocean_vertical_diffusivity
sea_floor_depth_below_sea_level
sea_surface_height
sea_water_salinity
sea_water_temperature
x_sea_water_velocity
y_sea_water_velocity
1) https://thredds.met.no/thredds/dodsC/fou-hi/norkystv3_800m_m00_be
-----
x_wind
y_wind
1) https://thredds.met.no/thredds/dodsC/fou-hi/norkystv3_800m_m00_be
2) https://thredds.met.no/thredds/dodsC/mepslatest/meps_lagged_6_h_latest_2_5km_latest.nc
-----
land_binary_mask
1) global_landmask
-----
Readers not added for the following variables:
horizontal_diffusivity
ocean_mixed_layer_thickness
sea_ice_area_fraction
sea_ice_x_velocity
sea_ice_y_velocity
sea_surface_wave_mean_period_from_variance_spectral_density_second_frequency_moment
sea_surface_wave_period_at_variance_spectral_density_maximum
sea_surface_wave_significant_height
sea_surface_wave_stokes_drift_x_velocity
sea_surface_wave_stokes_drift_y_velocity
Discarded readers:
Time:
Start: 2026-10-05 13:00:00 UTC
Present: 2026-10-06 01:00:00 UTC
Calculation steps: 48 * 0:15:00 - total time: 12:00:00
Output steps: 25 * 0:30:00
===========================
15:36:28 WARNING opendrift:2613: Plotting fast. This will make your plots less accurate.
15:37:28 WARNING opendrift:2613: Plotting fast. This will make your plots less accurate.
15:37:29 INFO opendrift:4823: Saving animation to /root/project/docs/source/gallery/animations/example_oil_verticalmixing_0.gif...
15:37:39 INFO opendrift:3241: Time to make animation: 0:00:10.734748
15:37:39 INFO opendrift:4823: Saving animation to /root/project/docs/source/gallery/animations/example_oil_verticalmixing_1.gif...
15:37:45 INFO opendrift.models.oceandrift:644: Time to make animation: 0:00:06.125676
Total running time of the script: (3 minutes 10.850 seconds)


