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)
14:39:55 INFO    opendrift:576: OpenDriftSimulation initialised (version 1.14.6 / v1.14.6-9-geaa6ee2)
14:39:55 INFO    opendrift.readers:63: Opening file with xr.open_dataset
14:39:56 INFO    opendrift.readers.reader_netCDF_CF_generic:332: Detected dimensions: {'time': 'time', 'x': 'x', 'y': 'y'}
14:39:56 INFO    opendrift.readers:63: Opening file with xr.open_dataset
14:40:02 INFO    opendrift.readers.reader_netCDF_CF_generic:332: Detected dimensions: {'x': 'X', 'y': 'Y', 'z': 'depth', 'time': 'time'}
14:40:02 INFO    opendrift.readers.basereader:176: Variable x_sea_water_velocity will be rotated from eastward_sea_water_velocity
14:40:02 INFO    opendrift.readers.basereader:176: Variable y_sea_water_velocity will be rotated from northward_sea_water_velocity
14:40:02 INFO    opendrift.readers.basereader:176: Variable x_wind will be rotated from eastward_wind
14:40:02 INFO    opendrift.readers.basereader:176: Variable y_wind will be rotated from northward_wind
14:40:02 INFO    opendrift.models.openoil.adios.dirjs:86: Querying ADIOS database for oil: GENERIC DIESEL
14:40:02 INFO    opendrift.models.openoil.openoil:1717: Using density 855.84763 and viscosity 8.644570579524623e-06 of oiltype GENERIC DIESEL
14:40:02 INFO    opendrift.models.basemodel.environment:203: Adding a global landmask from GSHHG
14:40:07 INFO    opendrift.models.basemodel.environment:227: Fallback values will be used for the following variables which have no readers:
14:40:07 INFO    opendrift.models.basemodel.environment:230:    sea_surface_wave_significant_height: 0.000000
14:40:07 INFO    opendrift.models.basemodel.environment:230:    sea_surface_wave_stokes_drift_x_velocity: 0.000000
14:40:07 INFO    opendrift.models.basemodel.environment:230:    sea_surface_wave_stokes_drift_y_velocity: 0.000000
14:40:07 INFO    opendrift.models.basemodel.environment:230:    sea_surface_wave_period_at_variance_spectral_density_maximum: 0.000000
14:40:07 INFO    opendrift.models.basemodel.environment:230:    sea_surface_wave_mean_period_from_variance_spectral_density_second_frequency_moment: 0.000000
14:40:07 INFO    opendrift.models.basemodel.environment:230:    sea_ice_area_fraction: 0.000000
14:40:07 INFO    opendrift.models.basemodel.environment:230:    sea_ice_x_velocity: 0.000000
14:40:07 INFO    opendrift.models.basemodel.environment:230:    sea_ice_y_velocity: 0.000000
14:40:07 INFO    opendrift.models.basemodel.environment:230:    ocean_mixed_layer_thickness: 50.000000
14:40:07 INFO    opendrift:1794: Skipping environment variable upward_sea_water_velocity because of condition ['drift:vertical_advection', 'is', False]
14:40:07 INFO    opendrift:1805: Storing previous values of element property lon because of condition (('general:coastline_action', 'in', ['stranding', 'previous']), 'or', ('general:seafloor_action', 'in', ['previous']))
14:40:07 INFO    opendrift:1805: Storing previous values of element property lat because of condition (('general:coastline_action', 'in', ['stranding', 'previous']), 'or', ('general:seafloor_action', 'in', ['previous']))
14:40:07 INFO    opendrift:952: Using existing reader for land_binary_mask to move elements to ocean
14:40:07 INFO    opendrift:982: All points are in ocean
14:40:07 INFO    opendrift.models.openoil.openoil:692: Oil-water surface tension is 0.030314 Nm
14:40:07 INFO    opendrift.models.openoil.openoil:705: Max water fraction not available for GENERIC DIESEL, using default
14:40:07 INFO    opendrift:2101: 2025-11-10 12:00:00 - step 1 of 48 - 5000 active elements (0 deactivated)
14:40:11 INFO    opendrift:2101: 2025-11-10 12:15:00 - step 2 of 48 - 5000 active elements (0 deactivated)
14:40:15 INFO    opendrift:2101: 2025-11-10 12:30:00 - step 3 of 48 - 5000 active elements (0 deactivated)
14:40:16 INFO    opendrift:2101: 2025-11-10 12:45:00 - step 4 of 48 - 5000 active elements (0 deactivated)
14:40:16 INFO    opendrift:2101: 2025-11-10 13:00:00 - step 5 of 48 - 5000 active elements (0 deactivated)
14:40:16 INFO    opendrift:2101: 2025-11-10 13:15:00 - step 6 of 48 - 5000 active elements (0 deactivated)
14:40:21 INFO    opendrift:2101: 2025-11-10 13:30:00 - step 7 of 48 - 5000 active elements (0 deactivated)
14:40:22 INFO    opendrift:2101: 2025-11-10 13:45:00 - step 8 of 48 - 5000 active elements (0 deactivated)
14:40:22 INFO    opendrift:2101: 2025-11-10 14:00:00 - step 9 of 48 - 5000 active elements (0 deactivated)
14:40:22 INFO    opendrift:2101: 2025-11-10 14:15:00 - step 10 of 48 - 5000 active elements (0 deactivated)
14:40:24 INFO    opendrift:2101: 2025-11-10 14:30:00 - step 11 of 48 - 5000 active elements (0 deactivated)
14:40:25 INFO    opendrift:2101: 2025-11-10 14:45:00 - step 12 of 48 - 5000 active elements (0 deactivated)
14:40:25 INFO    opendrift:2101: 2025-11-10 15:00:00 - step 13 of 48 - 5000 active elements (0 deactivated)
14:40:25 INFO    opendrift:2101: 2025-11-10 15:15:00 - step 14 of 48 - 5000 active elements (0 deactivated)
14:40:27 INFO    opendrift:2101: 2025-11-10 15:30:00 - step 15 of 48 - 5000 active elements (0 deactivated)
14:40:28 INFO    opendrift:2101: 2025-11-10 15:45:00 - step 16 of 48 - 5000 active elements (0 deactivated)
14:40:28 INFO    opendrift:2101: 2025-11-10 16:00:00 - step 17 of 48 - 5000 active elements (0 deactivated)
14:40:28 INFO    opendrift:2101: 2025-11-10 16:15:00 - step 18 of 48 - 5000 active elements (0 deactivated)
14:40:31 INFO    opendrift:2101: 2025-11-10 16:30:00 - step 19 of 48 - 5000 active elements (0 deactivated)
14:40:32 INFO    opendrift:2101: 2025-11-10 16:45:00 - step 20 of 48 - 5000 active elements (0 deactivated)
14:40:32 INFO    opendrift:2101: 2025-11-10 17:00:00 - step 21 of 48 - 5000 active elements (0 deactivated)
14:40:32 INFO    opendrift:2101: 2025-11-10 17:15:00 - step 22 of 48 - 5000 active elements (0 deactivated)
14:40:36 INFO    opendrift:2101: 2025-11-10 17:30:00 - step 23 of 48 - 5000 active elements (0 deactivated)
14:40:37 INFO    opendrift:2101: 2025-11-10 17:45:00 - step 24 of 48 - 5000 active elements (0 deactivated)
14:40:37 INFO    opendrift:2101: 2025-11-10 18:00:00 - step 25 of 48 - 5000 active elements (0 deactivated)
14:40:38 INFO    opendrift:2101: 2025-11-10 18:15:00 - step 26 of 48 - 5000 active elements (0 deactivated)
14:40:41 INFO    opendrift:2101: 2025-11-10 18:30:00 - step 27 of 48 - 5000 active elements (0 deactivated)
14:40:43 INFO    opendrift:2101: 2025-11-10 18:45:00 - step 28 of 48 - 5000 active elements (0 deactivated)
14:40:45 INFO    opendrift:2101: 2025-11-10 19:00:00 - step 29 of 48 - 5000 active elements (0 deactivated)
14:40:48 INFO    opendrift:2101: 2025-11-10 19:15:00 - step 30 of 48 - 5000 active elements (0 deactivated)
14:40:53 INFO    opendrift:2101: 2025-11-10 19:30:00 - step 31 of 48 - 5000 active elements (0 deactivated)
14:40:54 INFO    opendrift:2101: 2025-11-10 19:45:00 - step 32 of 48 - 5000 active elements (0 deactivated)
14:40:54 INFO    opendrift:2101: 2025-11-10 20:00:00 - step 33 of 48 - 5000 active elements (0 deactivated)
14:40:55 INFO    opendrift:2101: 2025-11-10 20:15:00 - step 34 of 48 - 5000 active elements (0 deactivated)
14:40:58 INFO    opendrift:2101: 2025-11-10 20:30:00 - step 35 of 48 - 5000 active elements (0 deactivated)
14:40:58 INFO    opendrift:2101: 2025-11-10 20:45:00 - step 36 of 48 - 5000 active elements (0 deactivated)
14:40:58 INFO    opendrift:2101: 2025-11-10 21:00:00 - step 37 of 48 - 5000 active elements (0 deactivated)
14:40:59 INFO    opendrift:2101: 2025-11-10 21:15:00 - step 38 of 48 - 5000 active elements (0 deactivated)
14:41:01 INFO    opendrift:2101: 2025-11-10 21:30:00 - step 39 of 48 - 5000 active elements (0 deactivated)
14:41:01 INFO    opendrift:2101: 2025-11-10 21:45:00 - step 40 of 48 - 5000 active elements (0 deactivated)
14:41:02 INFO    opendrift:2101: 2025-11-10 22:00:00 - step 41 of 48 - 5000 active elements (0 deactivated)
14:41:02 INFO    opendrift:2101: 2025-11-10 22:15:00 - step 42 of 48 - 5000 active elements (0 deactivated)
14:41:05 INFO    opendrift:2101: 2025-11-10 22:30:00 - step 43 of 48 - 5000 active elements (0 deactivated)
14:41:05 INFO    opendrift:2101: 2025-11-10 22:45:00 - step 44 of 48 - 5000 active elements (0 deactivated)
14:41:05 INFO    opendrift:2101: 2025-11-10 23:00:00 - step 45 of 48 - 5000 active elements (0 deactivated)
14:41:05 INFO    opendrift:2101: 2025-11-10 23:15:00 - step 46 of 48 - 5000 active elements (0 deactivated)
14:41:09 INFO    opendrift:2101: 2025-11-10 23:30:00 - step 47 of 48 - 5000 active elements (0 deactivated)
14:41:09 INFO    opendrift:2101: 2025-11-10 23: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
  • OpenDrift - OpenOil (GENERIC DIESEL) 2025-11-10 12:00 to 2025-11-11 00:00 UTC (25 steps)
  • z
  • GENERIC DIESEL (855.8 kg/m3) - 2025-11-10 12:00 to 2025-11-11 00:00
===========================
--------------------
Reader performance:
--------------------
https://thredds.met.no/thredds/dodsC/fou-hi/norkystv3_800m_m00_be
 0:00:37.4  total
 0:00:00.0  preparing
 0:00:36.5  reading
 0:00:02.4  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:14.3 total time
   12.2 configuration
    0.0 preparing main loop
      0.0 moving elements to ocean
 1:02.0 main loop
     22.0 updating elements
        2.3 oil weathering
          0.0 updating viscosities
          0.0 updating densities
          2.2 evaporation
          0.0 emulsification
          0.0 dispersion
       19.2 vertical mixing
    0.0 cleaning up
--------------------
===========================
Model:  OpenOil     (OpenDrift version 1.14.6)
        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:
  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: 2025-11-10 12:00:00 UTC
        Present: 2025-11-11 00:00:00 UTC
        Calculation steps: 48 * 0:15:00 - total time: 12:00:00
        Output steps: 25 * 0:30:00
===========================

14:41:11 WARNING opendrift:2460: Plotting fast. This will make your plots less accurate.
14:42:18 WARNING opendrift:2460: Plotting fast. This will make your plots less accurate.
14:42:19 INFO    opendrift:4636: Saving animation to /root/project/docs/source/gallery/animations/example_oil_verticalmixing_0.gif...
14:42:36 INFO    opendrift:3071: Time to make animation: 0:00:17.825845
14:42:36 INFO    opendrift:4636: Saving animation to /root/project/docs/source/gallery/animations/example_oil_verticalmixing_1.gif...
14:42:42 INFO    opendrift.models.oceandrift:643: Time to make animation: 0:00:06.543901
../_images/example_oil_verticalmixing_0.gif ../_images/example_oil_verticalmixing_1.gif

Total running time of the script: (3 minutes 3.184 seconds)

Gallery generated by Sphinx-Gallery