Note
Go to the end to download the full example code
Use a shapefile as landmask
import numpy as np
from opendrift.readers import reader_netCDF_CF_generic
from opendrift.readers import reader_shape
from opendrift.models.oceandrift import OceanDrift
o = OceanDrift(loglevel=20) # Set loglevel to 0 for debug information
# This example works better using hourly input from Thredds than the daily data from test folder
reader_topaz = reader_netCDF_CF_generic.Reader('https://thredds.met.no/thredds/dodsC/cmems/topaz6/dataset-topaz6-arc-15min-3km-be.ncml')
13:59:12 INFO opendrift.models.basemodel:539: OpenDriftSimulation initialised (version 1.10.7 / v1.10.6-119-g1da5bec)
13:59:12 INFO opendrift.readers.reader_netCDF_CF_generic:92: Opening dataset: https://thredds.met.no/thredds/dodsC/cmems/topaz6/dataset-topaz6-arc-15min-3km-be.ncml
/opt/conda/envs/opendrift/lib/python3.11/site-packages/pyproj/crs/crs.py:1286: UserWarning: You will likely lose important projection information when converting to a PROJ string from another format. See: https://proj.org/faq.html#what-is-the-best-format-for-describing-coordinate-reference-systems
proj = self._crs.to_proj4(version=version)
Use shapes from Cartopy as landmask. These shapefiles are less acurate than those provided by the GSHHG dataset (available though the reader_global_landmask reader).
import cartopy.io.shapereader as shpreader
shpfilename = shpreader.natural_earth(resolution='110m',
category='cultural',
name='admin_0_countries')
reader_natural = reader_shape.Reader.from_shpfiles(shpfilename)
o.add_reader([reader_natural, reader_topaz])
o.set_config('general:use_auto_landmask', False) # Disabling the automatic GSHHG landmask
o.set_config('general:coastline_action', 'stranding')
13:59:19 INFO opendrift.readers.reader_shape:91: Pre-processing 177 geometries
Seeding elements on a grid
lons = np.linspace(12, 14.7, 30)
lats = np.linspace(67.5, 68.5, 30)
lons, lats = np.meshgrid(lons, lats)
lon = lons.ravel()
lat = lats.ravel()
time = reader_topaz.start_time
o.seed_elements(lon, lat, radius=0, number=30*30, time=time)
o.run(steps=48, time_step=3600)
13:59:19 INFO opendrift.models.basemodel:2591: Fallback values will be used for the following variables which have no readers:
13:59:19 INFO opendrift.models.basemodel:2594: x_wind: 0.000000
13:59:19 INFO opendrift.models.basemodel:2594: y_wind: 0.000000
13:59:19 INFO opendrift.models.basemodel:2594: upward_sea_water_velocity: 0.000000
13:59:19 INFO opendrift.models.basemodel:2594: ocean_vertical_diffusivity: 0.000000
13:59:19 INFO opendrift.models.basemodel:2594: sea_surface_wave_significant_height: 0.000000
13:59:19 INFO opendrift.models.basemodel:2594: sea_surface_wave_stokes_drift_x_velocity: 0.000000
13:59:19 INFO opendrift.models.basemodel:2594: sea_surface_wave_stokes_drift_y_velocity: 0.000000
13:59:19 INFO opendrift.models.basemodel:2594: sea_surface_wave_period_at_variance_spectral_density_maximum: 0.000000
13:59:19 INFO opendrift.models.basemodel:2594: sea_surface_wave_mean_period_from_variance_spectral_density_second_frequency_moment: 0.000000
13:59:19 INFO opendrift.models.basemodel:2594: sea_surface_swell_wave_to_direction: 0.000000
13:59:19 INFO opendrift.models.basemodel:2594: sea_surface_swell_wave_peak_period_from_variance_spectral_density: 0.000000
13:59:19 INFO opendrift.models.basemodel:2594: sea_surface_swell_wave_significant_height: 0.000000
13:59:19 INFO opendrift.models.basemodel:2594: sea_surface_wind_wave_to_direction: 0.000000
13:59:19 INFO opendrift.models.basemodel:2594: sea_surface_wind_wave_mean_period: 0.000000
13:59:19 INFO opendrift.models.basemodel:2594: sea_surface_wind_wave_significant_height: 0.000000
13:59:19 INFO opendrift.models.basemodel:2594: surface_downward_x_stress: 0.000000
13:59:19 INFO opendrift.models.basemodel:2594: surface_downward_y_stress: 0.000000
13:59:19 INFO opendrift.models.basemodel:2594: turbulent_kinetic_energy: 0.000000
13:59:19 INFO opendrift.models.basemodel:2594: turbulent_generic_length_scale: 0.000000
13:59:19 INFO opendrift.models.basemodel:2594: ocean_mixed_layer_thickness: 50.000000
13:59:19 INFO opendrift.models.basemodel:1701: Using existing reader for land_binary_mask
13:59:19 INFO opendrift.models.basemodel:1715: Moving 20 out of 900 points from land to water
/root/project/opendrift/readers/interpolation/interpolators.py:17: RuntimeWarning: overflow encountered in cast
data[mask] = np.finfo(np.float64).min
13:59:19 INFO opendrift.models.basemodel:2882: 2018-01-01 00:00:00 - step 1 of 48 - 900 active elements (0 deactivated)
13:59:20 INFO opendrift.models.basemodel:2882: 2018-01-01 01:00:00 - step 2 of 48 - 900 active elements (0 deactivated)
13:59:20 INFO opendrift.models.basemodel:2882: 2018-01-01 02:00:00 - step 3 of 48 - 900 active elements (0 deactivated)
13:59:21 INFO opendrift.models.basemodel:2882: 2018-01-01 03:00:00 - step 4 of 48 - 900 active elements (0 deactivated)
13:59:21 INFO opendrift.models.basemodel:2882: 2018-01-01 04:00:00 - step 5 of 48 - 900 active elements (0 deactivated)
13:59:22 INFO opendrift.models.basemodel:2882: 2018-01-01 05:00:00 - step 6 of 48 - 900 active elements (0 deactivated)
13:59:22 INFO opendrift.models.basemodel:2882: 2018-01-01 06:00:00 - step 7 of 48 - 900 active elements (0 deactivated)
13:59:23 INFO opendrift.models.basemodel:2882: 2018-01-01 07:00:00 - step 8 of 48 - 900 active elements (0 deactivated)
13:59:23 INFO opendrift.models.basemodel:2882: 2018-01-01 08:00:00 - step 9 of 48 - 900 active elements (0 deactivated)
13:59:24 INFO opendrift.models.basemodel:2882: 2018-01-01 09:00:00 - step 10 of 48 - 900 active elements (0 deactivated)
13:59:24 INFO opendrift.models.basemodel:2882: 2018-01-01 10:00:00 - step 11 of 48 - 900 active elements (0 deactivated)
13:59:25 INFO opendrift.models.basemodel:2882: 2018-01-01 11:00:00 - step 12 of 48 - 900 active elements (0 deactivated)
13:59:25 INFO opendrift.models.basemodel:2882: 2018-01-01 12:00:00 - step 13 of 48 - 900 active elements (0 deactivated)
13:59:26 INFO opendrift.models.basemodel:2882: 2018-01-01 13:00:00 - step 14 of 48 - 896 active elements (4 deactivated)
13:59:26 INFO opendrift.models.basemodel:2882: 2018-01-01 14:00:00 - step 15 of 48 - 896 active elements (4 deactivated)
13:59:27 INFO opendrift.models.basemodel:2882: 2018-01-01 15:00:00 - step 16 of 48 - 896 active elements (4 deactivated)
13:59:27 INFO opendrift.models.basemodel:2882: 2018-01-01 16:00:00 - step 17 of 48 - 896 active elements (4 deactivated)
13:59:28 INFO opendrift.models.basemodel:2882: 2018-01-01 17:00:00 - step 18 of 48 - 896 active elements (4 deactivated)
13:59:28 INFO opendrift.models.basemodel:2882: 2018-01-01 18:00:00 - step 19 of 48 - 896 active elements (4 deactivated)
13:59:29 INFO opendrift.models.basemodel:2882: 2018-01-01 19:00:00 - step 20 of 48 - 896 active elements (4 deactivated)
13:59:29 INFO opendrift.models.basemodel:2882: 2018-01-01 20:00:00 - step 21 of 48 - 896 active elements (4 deactivated)
13:59:30 INFO opendrift.models.basemodel:2882: 2018-01-01 21:00:00 - step 22 of 48 - 896 active elements (4 deactivated)
13:59:31 INFO opendrift.models.basemodel:2882: 2018-01-01 22:00:00 - step 23 of 48 - 896 active elements (4 deactivated)
13:59:31 INFO opendrift.models.basemodel:2882: 2018-01-01 23:00:00 - step 24 of 48 - 896 active elements (4 deactivated)
13:59:32 INFO opendrift.models.basemodel:2882: 2018-01-02 00:00:00 - step 25 of 48 - 896 active elements (4 deactivated)
13:59:32 INFO opendrift.models.basemodel:2882: 2018-01-02 01:00:00 - step 26 of 48 - 896 active elements (4 deactivated)
13:59:33 INFO opendrift.models.basemodel:2882: 2018-01-02 02:00:00 - step 27 of 48 - 896 active elements (4 deactivated)
13:59:33 INFO opendrift.models.basemodel:2882: 2018-01-02 03:00:00 - step 28 of 48 - 896 active elements (4 deactivated)
13:59:34 INFO opendrift.models.basemodel:2882: 2018-01-02 04:00:00 - step 29 of 48 - 896 active elements (4 deactivated)
13:59:34 INFO opendrift.models.basemodel:2882: 2018-01-02 05:00:00 - step 30 of 48 - 896 active elements (4 deactivated)
13:59:35 INFO opendrift.models.basemodel:2882: 2018-01-02 06:00:00 - step 31 of 48 - 896 active elements (4 deactivated)
13:59:35 INFO opendrift.models.basemodel:2882: 2018-01-02 07:00:00 - step 32 of 48 - 896 active elements (4 deactivated)
13:59:36 INFO opendrift.models.basemodel:2882: 2018-01-02 08:00:00 - step 33 of 48 - 896 active elements (4 deactivated)
13:59:37 INFO opendrift.models.basemodel:2882: 2018-01-02 09:00:00 - step 34 of 48 - 896 active elements (4 deactivated)
13:59:37 INFO opendrift.models.basemodel:2882: 2018-01-02 10:00:00 - step 35 of 48 - 896 active elements (4 deactivated)
13:59:37 INFO opendrift.models.basemodel:2882: 2018-01-02 11:00:00 - step 36 of 48 - 895 active elements (5 deactivated)
13:59:38 INFO opendrift.models.basemodel:2882: 2018-01-02 12:00:00 - step 37 of 48 - 895 active elements (5 deactivated)
13:59:39 INFO opendrift.models.basemodel:2882: 2018-01-02 13:00:00 - step 38 of 48 - 895 active elements (5 deactivated)
13:59:39 INFO opendrift.models.basemodel:2882: 2018-01-02 14:00:00 - step 39 of 48 - 895 active elements (5 deactivated)
13:59:40 INFO opendrift.models.basemodel:2882: 2018-01-02 15:00:00 - step 40 of 48 - 894 active elements (6 deactivated)
13:59:40 INFO opendrift.models.basemodel:2882: 2018-01-02 16:00:00 - step 41 of 48 - 894 active elements (6 deactivated)
13:59:41 INFO opendrift.models.basemodel:2882: 2018-01-02 17:00:00 - step 42 of 48 - 894 active elements (6 deactivated)
13:59:41 INFO opendrift.models.basemodel:2882: 2018-01-02 18:00:00 - step 43 of 48 - 894 active elements (6 deactivated)
13:59:42 INFO opendrift.models.basemodel:2882: 2018-01-02 19:00:00 - step 44 of 48 - 894 active elements (6 deactivated)
13:59:42 INFO opendrift.models.basemodel:2882: 2018-01-02 20:00:00 - step 45 of 48 - 894 active elements (6 deactivated)
13:59:43 INFO opendrift.models.basemodel:2882: 2018-01-02 21:00:00 - step 46 of 48 - 894 active elements (6 deactivated)
13:59:43 INFO opendrift.models.basemodel:2882: 2018-01-02 22:00:00 - step 47 of 48 - 894 active elements (6 deactivated)
13:59:44 INFO opendrift.models.basemodel:2882: 2018-01-02 23:00:00 - step 48 of 48 - 894 active elements (6 deactivated)
The custom landmask from shapefile, which is used for the simulation, is also shown in the map instead of the default GSHHG
o.plot()
o.animation()

0.43684570043445464 ALPHA
/opt/conda/envs/opendrift/lib/python3.11/site-packages/cartopy/mpl/geoaxes.py:1696: UserWarning: No data for colormapping provided via 'c'. Parameters 'cmap' will be ignored
result = super().scatter(*args, **kwargs)
13:59:47 INFO opendrift.models.basemodel:5350: Saving animation to /root/project/docs/source/gallery/animations/example_shape_landmask_0.gif...
13:59:52 INFO opendrift.models.basemodel:3848: Time to make animation: 0:00:04.676654

Total running time of the script: (0 minutes 40.492 seconds)