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)
16:07:12 INFO opendrift:579: OpenDriftSimulation initialised (version 1.14.11 / v1.14.12-75-gf9e7122)
16:07:12 INFO opendrift.readers:67: Opening file with xr.open_dataset
16:07:14 INFO opendrift.readers.reader_netCDF_CF_generic:340: Detected dimensions: {'time': 'time', 'x': 'x', 'y': 'y'}
16:07:14 INFO opendrift.readers:67: Opening file with xr.open_dataset
16:07:24 INFO opendrift.readers.reader_netCDF_CF_generic:340: Detected dimensions: {'x': 'X', 'y': 'Y', 'z': 'depth', 'time': 'time'}
16:07:24 INFO opendrift.readers.basereader:175: Variable x_sea_water_velocity will be rotated from eastward_sea_water_velocity
16:07:24 INFO opendrift.readers.basereader:175: Variable y_sea_water_velocity will be rotated from northward_sea_water_velocity
16:07:24 INFO opendrift.readers.basereader:175: Variable x_wind will be rotated from eastward_wind
16:07:24 INFO opendrift.readers.basereader:175: Variable y_wind will be rotated from northward_wind
16:07:24 INFO opendrift.models.openoil.adios.dirjs:86: Querying ADIOS database for oil: GENERIC DIESEL
16:07:24 INFO opendrift.models.openoil.openoil:1731: Using density 855.84763 and viscosity 8.644570579524577e-06 of oiltype GENERIC DIESEL
16:07:24 INFO opendrift.models.basemodel.environment:203: Adding a global landmask from GSHHG
16:07:30 INFO opendrift.models.basemodel.environment:227: Fallback values will be used for the following variables which have no readers:
16:07:30 INFO opendrift.models.basemodel.environment:230: sea_surface_wave_significant_height: 0.000000
16:07:30 INFO opendrift.models.basemodel.environment:230: sea_surface_wave_stokes_drift_x_velocity: 0.000000
16:07:30 INFO opendrift.models.basemodel.environment:230: sea_surface_wave_stokes_drift_y_velocity: 0.000000
16:07:30 INFO opendrift.models.basemodel.environment:230: sea_surface_wave_period_at_variance_spectral_density_maximum: 0.000000
16:07:30 INFO opendrift.models.basemodel.environment:230: sea_surface_wave_mean_period_from_variance_spectral_density_second_frequency_moment: 0.000000
16:07:30 INFO opendrift.models.basemodel.environment:230: sea_ice_area_fraction: 0.000000
16:07:30 INFO opendrift.models.basemodel.environment:230: sea_ice_x_velocity: 0.000000
16:07:30 INFO opendrift.models.basemodel.environment:230: sea_ice_y_velocity: 0.000000
16:07:30 INFO opendrift.models.basemodel.environment:230: horizontal_diffusivity: 0.000000
16:07:30 INFO opendrift.models.basemodel.environment:230: ocean_mixed_layer_thickness: 50.000000
16:07:30 INFO opendrift:1921: Skipping environment variable upward_sea_water_velocity because of condition ['drift:vertical_advection', 'is', False]
16:07:30 INFO opendrift:1932: Storing previous values of element property lon because of condition (('general:coastline_action', 'in', ['stranding', 'previous']), 'or', ('general:seafloor_action', 'in', ['previous']))
16:07:30 INFO opendrift:1932: Storing previous values of element property lat because of condition (('general:coastline_action', 'in', ['stranding', 'previous']), 'or', ('general:seafloor_action', 'in', ['previous']))
16:07:30 INFO opendrift:968: Using existing reader for land_binary_mask to move elements to ocean
16:07:30 INFO opendrift:1000: All points are in ocean
16:07:30 INFO opendrift.models.openoil.openoil:697: Oil-water surface tension is 0.030314 Nm
16:07:30 INFO opendrift.models.openoil.openoil:710: Max water fraction not available for GENERIC DIESEL, using default
16:07:30 INFO opendrift:2248: 2026-11-12 14:00:00 - step 1 of 48 - 5000 active elements (0 deactivated)
16:07:48 INFO opendrift:2248: 2026-11-12 14:15:00 - step 2 of 48 - 5000 active elements (0 deactivated)
16:08:05 INFO opendrift:2248: 2026-11-12 14:30:00 - step 3 of 48 - 5000 active elements (0 deactivated)
16:08:05 INFO opendrift:2248: 2026-11-12 14:45:00 - step 4 of 48 - 5000 active elements (0 deactivated)
16:08:05 INFO opendrift:2248: 2026-11-12 15:00:00 - step 5 of 48 - 5000 active elements (0 deactivated)
16:08:06 INFO opendrift:2248: 2026-11-12 15:15:00 - step 6 of 48 - 5000 active elements (0 deactivated)
16:08:32 INFO opendrift:2248: 2026-11-12 15:30:00 - step 7 of 48 - 5000 active elements (0 deactivated)
16:08:32 INFO opendrift:2248: 2026-11-12 15:45:00 - step 8 of 48 - 5000 active elements (0 deactivated)
16:08:32 INFO opendrift:2248: 2026-11-12 16:00:00 - step 9 of 48 - 5000 active elements (0 deactivated)
16:08:33 INFO opendrift:2248: 2026-11-12 16:15:00 - step 10 of 48 - 5000 active elements (0 deactivated)
16:08:47 INFO opendrift:2248: 2026-11-12 16:30:00 - step 11 of 48 - 5000 active elements (0 deactivated)
16:08:47 INFO opendrift:2248: 2026-11-12 16:45:00 - step 12 of 48 - 5000 active elements (0 deactivated)
16:08:47 INFO opendrift:2248: 2026-11-12 17:00:00 - step 13 of 48 - 5000 active elements (0 deactivated)
16:08:48 INFO opendrift:2248: 2026-11-12 17:15:00 - step 14 of 48 - 5000 active elements (0 deactivated)
16:09:14 INFO opendrift:2248: 2026-11-12 17:30:00 - step 15 of 48 - 5000 active elements (0 deactivated)
16:09:14 INFO opendrift:2248: 2026-11-12 17:45:00 - step 16 of 48 - 5000 active elements (0 deactivated)
16:09:14 INFO opendrift:2248: 2026-11-12 18:00:00 - step 17 of 48 - 5000 active elements (0 deactivated)
16:09:14 INFO opendrift:2248: 2026-11-12 18:15:00 - step 18 of 48 - 5000 active elements (0 deactivated)
16:09:28 INFO opendrift:2248: 2026-11-12 18:30:00 - step 19 of 48 - 5000 active elements (0 deactivated)
16:09:28 INFO opendrift:2248: 2026-11-12 18:45:00 - step 20 of 48 - 5000 active elements (0 deactivated)
16:09:29 INFO opendrift:2248: 2026-11-12 19:00:00 - step 21 of 48 - 5000 active elements (0 deactivated)
16:09:29 INFO opendrift:2248: 2026-11-12 19:15:00 - step 22 of 48 - 5000 active elements (0 deactivated)
16:09:42 INFO opendrift:2248: 2026-11-12 19:30:00 - step 23 of 48 - 5000 active elements (0 deactivated)
16:09:42 INFO opendrift:2248: 2026-11-12 19:45:00 - step 24 of 48 - 5000 active elements (0 deactivated)
16:09:43 INFO opendrift:2248: 2026-11-12 20:00:00 - step 25 of 48 - 5000 active elements (0 deactivated)
16:09:43 INFO opendrift:2248: 2026-11-12 20:15:00 - step 26 of 48 - 5000 active elements (0 deactivated)
16:09:58 INFO opendrift:2248: 2026-11-12 20:30:00 - step 27 of 48 - 5000 active elements (0 deactivated)
16:09:59 INFO opendrift:2248: 2026-11-12 20:45:00 - step 28 of 48 - 5000 active elements (0 deactivated)
16:09:59 INFO opendrift:2248: 2026-11-12 21:00:00 - step 29 of 48 - 5000 active elements (0 deactivated)
16:09:59 INFO opendrift:2248: 2026-11-12 21:15:00 - step 30 of 48 - 5000 active elements (0 deactivated)
16:10:22 INFO opendrift:2248: 2026-11-12 21:30:00 - step 31 of 48 - 5000 active elements (0 deactivated)
16:10:22 INFO opendrift:2248: 2026-11-12 21:45:00 - step 32 of 48 - 5000 active elements (0 deactivated)
16:10:22 INFO opendrift:2248: 2026-11-12 22:00:00 - step 33 of 48 - 5000 active elements (0 deactivated)
16:10:23 INFO opendrift:2248: 2026-11-12 22:15:00 - step 34 of 48 - 5000 active elements (0 deactivated)
16:10:42 INFO opendrift:2248: 2026-11-12 22:30:00 - step 35 of 48 - 5000 active elements (0 deactivated)
16:10:42 INFO opendrift:2248: 2026-11-12 22:45:00 - step 36 of 48 - 5000 active elements (0 deactivated)
16:10:43 INFO opendrift:2248: 2026-11-12 23:00:00 - step 37 of 48 - 5000 active elements (0 deactivated)
16:10:43 INFO opendrift:2248: 2026-11-12 23:15:00 - step 38 of 48 - 5000 active elements (0 deactivated)
16:10:59 INFO opendrift:2248: 2026-11-12 23:30:00 - step 39 of 48 - 5000 active elements (0 deactivated)
16:11:00 INFO opendrift:2248: 2026-11-12 23:45:00 - step 40 of 48 - 5000 active elements (0 deactivated)
16:11:00 INFO opendrift:2248: 2026-11-13 00:00:00 - step 41 of 48 - 5000 active elements (0 deactivated)
16:11:00 INFO opendrift:2248: 2026-11-13 00:15:00 - step 42 of 48 - 5000 active elements (0 deactivated)
16:11:22 INFO opendrift:2248: 2026-11-13 00:30:00 - step 43 of 48 - 5000 active elements (0 deactivated)
16:11:22 INFO opendrift:2248: 2026-11-13 00:45:00 - step 44 of 48 - 5000 active elements (0 deactivated)
16:11:22 INFO opendrift:2248: 2026-11-13 01:00:00 - step 45 of 48 - 5000 active elements (0 deactivated)
16:11:22 INFO opendrift:2248: 2026-11-13 01:15:00 - step 46 of 48 - 5000 active elements (0 deactivated)
16:11:45 INFO opendrift:2248: 2026-11-13 01:30:00 - step 47 of 48 - 5000 active elements (0 deactivated)
16:11:46 INFO opendrift:2248: 2026-11-13 01:45:00 - step 48 of 48 - 5000 active elements (0 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:04:07.5 total
0:00:00.0 preparing
0:04:06.5 reading
0:00:02.6 interpolation
0:00:00.0 interpolation_time
0:00:00.9 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:
4:33.4 total time
17.9 configuration
0.1 preparing main loop
0.0 moving elements to ocean
4:15.4 main loop
4.7 updating elements
1.5 oil weathering
0.0 updating viscosities
0.0 updating densities
1.5 evaporation
0.0 emulsification
0.0 dispersion
2.7 vertical mixing
0.0 cleaning up
--------------------
===========================
Model: OpenOil (OpenDrift version 1.14.11)
5000 active Oil particles (0 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-11-12 14:00:00 UTC
Present: 2026-11-13 02:00:00 UTC
Calculation steps: 48 * 0:15:00 - total time: 12:00:00
Output steps: 25 * 0:30:00
===========================
16:11:47 WARNING opendrift:2624: Plotting fast. This will make your plots less accurate.
16:12:41 WARNING opendrift:2624: Plotting fast. This will make your plots less accurate.
16:12:43 INFO opendrift:4899: Saving animation to /root/project/docs/source/gallery/animations/example_oil_verticalmixing_0.gif...
16:12:51 INFO opendrift:3307: Time to make animation: 0:00:10.092270
16:12:52 INFO opendrift:4899: Saving animation to /root/project/docs/source/gallery/animations/example_oil_verticalmixing_1.gif...
16:12:58 INFO opendrift.models.oceandrift:644: Time to make animation: 0:00:06.315982
Total running time of the script: (6 minutes 4.220 seconds)


