Note
Go to the end to download the full example code.
Making GRIB dataset CF-compatible
from datetime import datetime, timedelta
from opendrift.models.windblow import WindBlow
Comparing / using two different wind datasets
- The first dataset (UCAR) is a GRIB dataset served by Thredds as a netCDF dataset, but with GRIB attributes
- CF standard_name are added for identified surface variables (wind) with this method:
This should be used with care, making sure that only surface (10m height) variables are used
The second dataset (PACIOOS) is a netCDF4 dataset served by Thredds with CF attributes
wind_datasets = [
'https://thredds.ucar.edu/thredds/dodsC/grib/NCEP/GFS/Global_0p25deg/Best',
'https://pae-paha.pacioos.hawaii.edu/thredds/dodsC/ncep_global/NCEP_Global_Atmospheric_Model_best.ncd'
]
simulations = []
time = datetime.now() - timedelta(days=5)
for wind in wind_datasets:
o = WindBlow(loglevel=20)
o.add_readers_from_list(wind)
o.seed_elements(lon=3, lat=60, time=time, number=10, radius=10000)
o.run(duration=timedelta(hours=48))
simulations.append(o)
16:08:14 INFO opendrift:569: OpenDriftSimulation initialised (version 1.14.10 / v1.14.10-34-gf7a892a)
16:08:14 INFO opendrift.models.basemodel.environment:227: Fallback values will be used for the following variables which have no readers:
16:08:14 INFO opendrift.models.basemodel.environment:230: x_wind: 0.000000
16:08:14 INFO opendrift.models.basemodel.environment:230: y_wind: 0.000000
16:08:14 INFO opendrift:1914: Storing previous values of element property lon because of condition (('general:coastline_action', 'in', ['stranding', 'previous']), 'or', ('general:seafloor_action', 'in', ['previous']))
16:08:14 INFO opendrift:1914: Storing previous values of element property lat because of condition (('general:coastline_action', 'in', ['stranding', 'previous']), 'or', ('general:seafloor_action', 'in', ['previous']))
16:08:14 INFO opendrift:2213: 2026-08-16 16:08:14.399111 - step 1 of 48 - 10 active elements (0 deactivated)
16:08:14 INFO opendrift.readers:67: Opening file with xr.open_dataset
16:08:16 INFO opendrift.readers.reader_netCDF_CF_generic:340: Detected dimensions: {'time': ['time', 'time1', 'time2', 'time3'], 'x': 'lon', 'y': 'lat'}
16:08:16 INFO opendrift.readers.basereader:175: Variable x_wind will be rotated from eastward_wind
16:08:16 INFO opendrift.readers.basereader:175: Variable y_wind will be rotated from northward_wind
16:08:16 INFO opendrift:2213: 2026-08-16 17:08:14.399111 - step 2 of 48 - 10 active elements (0 deactivated)
16:08:16 INFO opendrift:2213: 2026-08-16 18:08:14.399111 - step 3 of 48 - 10 active elements (0 deactivated)
16:08:16 INFO opendrift:2213: 2026-08-16 19:08:14.399111 - step 4 of 48 - 10 active elements (0 deactivated)
16:08:16 INFO opendrift:2213: 2026-08-16 20:08:14.399111 - step 5 of 48 - 10 active elements (0 deactivated)
16:08:16 INFO opendrift:2213: 2026-08-16 21:08:14.399111 - step 6 of 48 - 10 active elements (0 deactivated)
16:08:17 INFO opendrift:2213: 2026-08-16 22:08:14.399111 - step 7 of 48 - 10 active elements (0 deactivated)
16:08:17 INFO opendrift:2213: 2026-08-16 23:08:14.399111 - step 8 of 48 - 10 active elements (0 deactivated)
16:08:17 INFO opendrift:2213: 2026-08-17 00:08:14.399111 - step 9 of 48 - 10 active elements (0 deactivated)
16:08:17 INFO opendrift:2213: 2026-08-17 01:08:14.399111 - step 10 of 48 - 10 active elements (0 deactivated)
16:08:17 INFO opendrift:2213: 2026-08-17 02:08:14.399111 - step 11 of 48 - 10 active elements (0 deactivated)
16:08:17 INFO opendrift:2213: 2026-08-17 03:08:14.399111 - step 12 of 48 - 10 active elements (0 deactivated)
16:08:17 INFO opendrift:2213: 2026-08-17 04:08:14.399111 - step 13 of 48 - 10 active elements (0 deactivated)
16:08:17 INFO opendrift:2213: 2026-08-17 05:08:14.399111 - step 14 of 48 - 10 active elements (0 deactivated)
16:08:17 INFO opendrift:2213: 2026-08-17 06:08:14.399111 - step 15 of 48 - 10 active elements (0 deactivated)
16:08:17 INFO opendrift:2213: 2026-08-17 07:08:14.399111 - step 16 of 48 - 10 active elements (0 deactivated)
16:08:17 INFO opendrift:2213: 2026-08-17 08:08:14.399111 - step 17 of 48 - 10 active elements (0 deactivated)
16:08:18 INFO opendrift:2213: 2026-08-17 09:08:14.399111 - step 18 of 48 - 10 active elements (0 deactivated)
16:08:18 INFO opendrift:2213: 2026-08-17 10:08:14.399111 - step 19 of 48 - 10 active elements (0 deactivated)
16:08:18 INFO opendrift:2213: 2026-08-17 11:08:14.399111 - step 20 of 48 - 10 active elements (0 deactivated)
16:08:18 INFO opendrift:2213: 2026-08-17 12:08:14.399111 - step 21 of 48 - 10 active elements (0 deactivated)
16:08:18 INFO opendrift:2213: 2026-08-17 13:08:14.399111 - step 22 of 48 - 10 active elements (0 deactivated)
16:08:18 INFO opendrift:2213: 2026-08-17 14:08:14.399111 - step 23 of 48 - 10 active elements (0 deactivated)
16:08:18 INFO opendrift:2213: 2026-08-17 15:08:14.399111 - step 24 of 48 - 10 active elements (0 deactivated)
16:08:18 INFO opendrift:2213: 2026-08-17 16:08:14.399111 - step 25 of 48 - 10 active elements (0 deactivated)
16:08:18 INFO opendrift:2213: 2026-08-17 17:08:14.399111 - step 26 of 48 - 10 active elements (0 deactivated)
16:08:18 INFO opendrift:2213: 2026-08-17 18:08:14.399111 - step 27 of 48 - 10 active elements (0 deactivated)
16:08:19 INFO opendrift:2213: 2026-08-17 19:08:14.399111 - step 28 of 48 - 10 active elements (0 deactivated)
16:08:19 INFO opendrift:2213: 2026-08-17 20:08:14.399111 - step 29 of 48 - 10 active elements (0 deactivated)
16:08:19 INFO opendrift:2213: 2026-08-17 21:08:14.399111 - step 30 of 48 - 10 active elements (0 deactivated)
16:08:19 INFO opendrift:2213: 2026-08-17 22:08:14.399111 - step 31 of 48 - 10 active elements (0 deactivated)
16:08:19 INFO opendrift:2213: 2026-08-17 23:08:14.399111 - step 32 of 48 - 10 active elements (0 deactivated)
16:08:19 INFO opendrift:2213: 2026-08-18 00:08:14.399111 - step 33 of 48 - 10 active elements (0 deactivated)
16:08:19 INFO opendrift:2213: 2026-08-18 01:08:14.399111 - step 34 of 48 - 10 active elements (0 deactivated)
16:08:19 INFO opendrift:2213: 2026-08-18 02:08:14.399111 - step 35 of 48 - 10 active elements (0 deactivated)
16:08:19 INFO opendrift:2213: 2026-08-18 03:08:14.399111 - step 36 of 48 - 10 active elements (0 deactivated)
16:08:20 INFO opendrift:2213: 2026-08-18 04:08:14.399111 - step 37 of 48 - 10 active elements (0 deactivated)
16:08:20 INFO opendrift:2213: 2026-08-18 05:08:14.399111 - step 38 of 48 - 10 active elements (0 deactivated)
16:08:20 INFO opendrift:2213: 2026-08-18 06:08:14.399111 - step 39 of 48 - 10 active elements (0 deactivated)
16:08:20 INFO opendrift:2213: 2026-08-18 07:08:14.399111 - step 40 of 48 - 10 active elements (0 deactivated)
16:08:20 INFO opendrift:2213: 2026-08-18 08:08:14.399111 - step 41 of 48 - 10 active elements (0 deactivated)
16:08:20 INFO opendrift:2213: 2026-08-18 09:08:14.399111 - step 42 of 48 - 10 active elements (0 deactivated)
16:08:20 INFO opendrift:2213: 2026-08-18 10:08:14.399111 - step 43 of 48 - 10 active elements (0 deactivated)
16:08:20 INFO opendrift:2213: 2026-08-18 11:08:14.399111 - step 44 of 48 - 10 active elements (0 deactivated)
16:08:20 INFO opendrift:2213: 2026-08-18 12:08:14.399111 - step 45 of 48 - 10 active elements (0 deactivated)
16:08:20 INFO opendrift:2213: 2026-08-18 13:08:14.399111 - step 46 of 48 - 10 active elements (0 deactivated)
16:08:20 INFO opendrift:2213: 2026-08-18 14:08:14.399111 - step 47 of 48 - 10 active elements (0 deactivated)
16:08:21 INFO opendrift:2213: 2026-08-18 15:08:14.399111 - step 48 of 48 - 10 active elements (0 deactivated)
16:08:21 INFO opendrift:569: OpenDriftSimulation initialised (version 1.14.10 / v1.14.10-34-gf7a892a)
16:08:21 INFO opendrift.models.basemodel.environment:227: Fallback values will be used for the following variables which have no readers:
16:08:21 INFO opendrift.models.basemodel.environment:230: x_wind: 0.000000
16:08:21 INFO opendrift.models.basemodel.environment:230: y_wind: 0.000000
16:08:21 INFO opendrift:1914: Storing previous values of element property lon because of condition (('general:coastline_action', 'in', ['stranding', 'previous']), 'or', ('general:seafloor_action', 'in', ['previous']))
16:08:21 INFO opendrift:1914: Storing previous values of element property lat because of condition (('general:coastline_action', 'in', ['stranding', 'previous']), 'or', ('general:seafloor_action', 'in', ['previous']))
16:08:21 INFO opendrift:2213: 2026-08-16 16:08:14.399111 - step 1 of 48 - 10 active elements (0 deactivated)
16:08:21 INFO opendrift.readers:67: Opening file with xr.open_dataset
16:08:23 INFO opendrift.readers.reader_netCDF_CF_generic:340: Detected dimensions: {'time': 'time', 'x': 'longitude', 'y': 'latitude'}
16:08:23 INFO opendrift.readers.basereader:175: Variable x_wind will be rotated from eastward_wind
16:08:23 INFO opendrift.readers.basereader:175: Variable y_wind will be rotated from northward_wind
16:08:23 INFO opendrift:2213: 2026-08-16 17:08:14.399111 - step 2 of 48 - 10 active elements (0 deactivated)
16:08:23 INFO opendrift:2213: 2026-08-16 18:08:14.399111 - step 3 of 48 - 10 active elements (0 deactivated)
16:08:24 INFO opendrift:2213: 2026-08-16 19:08:14.399111 - step 4 of 48 - 10 active elements (0 deactivated)
16:08:24 INFO opendrift:2213: 2026-08-16 20:08:14.399111 - step 5 of 48 - 10 active elements (0 deactivated)
16:08:24 INFO opendrift:2213: 2026-08-16 21:08:14.399111 - step 6 of 48 - 10 active elements (0 deactivated)
16:08:24 INFO opendrift:2213: 2026-08-16 22:08:14.399111 - step 7 of 48 - 10 active elements (0 deactivated)
16:08:24 INFO opendrift:2213: 2026-08-16 23:08:14.399111 - step 8 of 48 - 10 active elements (0 deactivated)
16:08:24 INFO opendrift:2213: 2026-08-17 00:08:14.399111 - step 9 of 48 - 10 active elements (0 deactivated)
16:08:24 INFO opendrift:2213: 2026-08-17 01:08:14.399111 - step 10 of 48 - 10 active elements (0 deactivated)
16:08:24 INFO opendrift:2213: 2026-08-17 02:08:14.399111 - step 11 of 48 - 10 active elements (0 deactivated)
16:08:24 INFO opendrift:2213: 2026-08-17 03:08:14.399111 - step 12 of 48 - 10 active elements (0 deactivated)
16:08:25 INFO opendrift:2213: 2026-08-17 04:08:14.399111 - step 13 of 48 - 10 active elements (0 deactivated)
16:08:25 INFO opendrift:2213: 2026-08-17 05:08:14.399111 - step 14 of 48 - 10 active elements (0 deactivated)
16:08:25 INFO opendrift:2213: 2026-08-17 06:08:14.399111 - step 15 of 48 - 10 active elements (0 deactivated)
16:08:25 INFO opendrift:2213: 2026-08-17 07:08:14.399111 - step 16 of 48 - 10 active elements (0 deactivated)
16:08:25 INFO opendrift:2213: 2026-08-17 08:08:14.399111 - step 17 of 48 - 10 active elements (0 deactivated)
16:08:25 INFO opendrift:2213: 2026-08-17 09:08:14.399111 - step 18 of 48 - 10 active elements (0 deactivated)
16:08:25 INFO opendrift:2213: 2026-08-17 10:08:14.399111 - step 19 of 48 - 10 active elements (0 deactivated)
16:08:25 INFO opendrift:2213: 2026-08-17 11:08:14.399111 - step 20 of 48 - 10 active elements (0 deactivated)
16:08:25 INFO opendrift:2213: 2026-08-17 12:08:14.399111 - step 21 of 48 - 10 active elements (0 deactivated)
16:08:25 INFO opendrift:2213: 2026-08-17 13:08:14.399111 - step 22 of 48 - 10 active elements (0 deactivated)
16:08:25 INFO opendrift:2213: 2026-08-17 14:08:14.399111 - step 23 of 48 - 10 active elements (0 deactivated)
16:08:25 INFO opendrift:2213: 2026-08-17 15:08:14.399111 - step 24 of 48 - 10 active elements (0 deactivated)
16:08:26 INFO opendrift:2213: 2026-08-17 16:08:14.399111 - step 25 of 48 - 10 active elements (0 deactivated)
16:08:26 INFO opendrift:2213: 2026-08-17 17:08:14.399111 - step 26 of 48 - 10 active elements (0 deactivated)
16:08:26 INFO opendrift:2213: 2026-08-17 18:08:14.399111 - step 27 of 48 - 10 active elements (0 deactivated)
16:08:26 INFO opendrift:2213: 2026-08-17 19:08:14.399111 - step 28 of 48 - 10 active elements (0 deactivated)
16:08:26 INFO opendrift:2213: 2026-08-17 20:08:14.399111 - step 29 of 48 - 10 active elements (0 deactivated)
16:08:26 INFO opendrift:2213: 2026-08-17 21:08:14.399111 - step 30 of 48 - 10 active elements (0 deactivated)
16:08:26 INFO opendrift:2213: 2026-08-17 22:08:14.399111 - step 31 of 48 - 10 active elements (0 deactivated)
16:08:26 INFO opendrift:2213: 2026-08-17 23:08:14.399111 - step 32 of 48 - 10 active elements (0 deactivated)
16:08:26 INFO opendrift:2213: 2026-08-18 00:08:14.399111 - step 33 of 48 - 10 active elements (0 deactivated)
16:08:27 INFO opendrift:2213: 2026-08-18 01:08:14.399111 - step 34 of 48 - 10 active elements (0 deactivated)
16:08:27 INFO opendrift:2213: 2026-08-18 02:08:14.399111 - step 35 of 48 - 10 active elements (0 deactivated)
16:08:27 INFO opendrift:2213: 2026-08-18 03:08:14.399111 - step 36 of 48 - 10 active elements (0 deactivated)
16:08:27 INFO opendrift:2213: 2026-08-18 04:08:14.399111 - step 37 of 48 - 10 active elements (0 deactivated)
16:08:27 INFO opendrift:2213: 2026-08-18 05:08:14.399111 - step 38 of 48 - 10 active elements (0 deactivated)
16:08:27 INFO opendrift:2213: 2026-08-18 06:08:14.399111 - step 39 of 48 - 10 active elements (0 deactivated)
16:08:27 INFO opendrift:2213: 2026-08-18 07:08:14.399111 - step 40 of 48 - 10 active elements (0 deactivated)
16:08:27 INFO opendrift:2213: 2026-08-18 08:08:14.399111 - step 41 of 48 - 10 active elements (0 deactivated)
16:08:27 INFO opendrift:2213: 2026-08-18 09:08:14.399111 - step 42 of 48 - 10 active elements (0 deactivated)
16:08:28 INFO opendrift:2213: 2026-08-18 10:08:14.399111 - step 43 of 48 - 10 active elements (0 deactivated)
16:08:28 INFO opendrift:2213: 2026-08-18 11:08:14.399111 - step 44 of 48 - 10 active elements (0 deactivated)
16:08:28 INFO opendrift:2213: 2026-08-18 12:08:14.399111 - step 45 of 48 - 10 active elements (0 deactivated)
16:08:28 INFO opendrift:2213: 2026-08-18 13:08:14.399111 - step 46 of 48 - 10 active elements (0 deactivated)
16:08:28 INFO opendrift:2213: 2026-08-18 14:08:14.399111 - step 47 of 48 - 10 active elements (0 deactivated)
16:08:28 INFO opendrift:2213: 2026-08-18 15:08:14.399111 - step 48 of 48 - 10 active elements (0 deactivated)
Some differences are expected as datasets may origin from different runs
simulations[0].plot(compare=simulations[1:], lscale='i', legend=['GRIB converted', 'netCDF CF compatible'])

(<GeoAxes: title={'center': 'OpenDrift - WindBlow\n2026-08-16 16:08 to 2026-08-18 16:08 UTC (49 steps)'}>, <Figure size 1003.02x1100 with 1 Axes>)
Total running time of the script: (0 minutes 29.338 seconds)