Note
Go to the end to download the full example code
Double gyre - Lagrangian Coherent Structures
Calculating attracting and repelling LCS for an idealised (analytical) eddy current field.
from datetime import datetime, timedelta
import matplotlib.pyplot as plt
from opendrift.readers import reader_double_gyre
from opendrift.models.oceandrift import OceanDrift
o = OceanDrift(loglevel=20) # Set loglevel to 0 for debug information
o.set_config('environment:fallback:land_binary_mask', 0)
14:00:05 INFO opendrift.models.basemodel:539: OpenDriftSimulation initialised (version 1.10.7 / v1.10.6-119-g1da5bec)
Note that Runge-Kutta here makes a difference to Euler scheme
o.set_config('drift:advection_scheme', 'runge-kutta4')
double_gyre = reader_double_gyre.Reader(epsilon=.25, omega=0.628, A=0.1)
print(double_gyre)
o.add_reader(double_gyre)
lcs = o.calculate_ftle(time=double_gyre.initial_time+timedelta(seconds=3),
time_step=timedelta(seconds=.5),
duration=timedelta(seconds=15),
delta=.02)
===========================
Reader: double_gyre
Projection:
+proj=stere +lat_0=0 +lon_0=0 +lat_ts=0 +units=m +a=6.371e+06 +e=0 +no_defs
Coverage: [degrees]
xmin: 0.000000 xmax: 2.000000
ymin: 0.000000 ymax: 1.000000
Corners (lon, lat):
( 0.00, 0.00) ( 0.00, 0.00)
( 0.00, 0.00) ( 0.00, 0.00)
Vertical levels [m]:
Not specified
Available time range:
start: None end: None step: None
Variables:
x_sea_water_velocity
y_sea_water_velocity
sea_water_speed - derived from ['x_sea_water_velocity', 'y_sea_water_velocity']
===========================
14:00:05 INFO opendrift.models.basemodel:5407: No reader provided, using first available:
14:00:05 INFO opendrift.models.basemodel:5409: double_gyre
14:00:05 INFO opendrift.models.basemodel:5443: Calculating LCS for 2000-01-01 00:00:03
14:00:05 INFO opendrift.models.basemodel:5497: Nothing to reset
14:00:05 INFO opendrift.models.basemodel:2591: Fallback values will be used for the following variables which have no readers:
14:00:05 INFO opendrift.models.basemodel:2594: x_wind: 0.000000
14:00:05 INFO opendrift.models.basemodel:2594: y_wind: 0.000000
14:00:05 INFO opendrift.models.basemodel:2594: upward_sea_water_velocity: 0.000000
14:00:05 INFO opendrift.models.basemodel:2594: ocean_vertical_diffusivity: 0.000000
14:00:05 INFO opendrift.models.basemodel:2594: sea_surface_wave_significant_height: 0.000000
14:00:05 INFO opendrift.models.basemodel:2594: sea_surface_wave_stokes_drift_x_velocity: 0.000000
14:00:05 INFO opendrift.models.basemodel:2594: sea_surface_wave_stokes_drift_y_velocity: 0.000000
14:00:05 INFO opendrift.models.basemodel:2594: sea_surface_wave_period_at_variance_spectral_density_maximum: 0.000000
14:00:05 INFO opendrift.models.basemodel:2594: sea_surface_wave_mean_period_from_variance_spectral_density_second_frequency_moment: 0.000000
14:00:05 INFO opendrift.models.basemodel:2594: sea_surface_swell_wave_to_direction: 0.000000
14:00:05 INFO opendrift.models.basemodel:2594: sea_surface_swell_wave_peak_period_from_variance_spectral_density: 0.000000
14:00:05 INFO opendrift.models.basemodel:2594: sea_surface_swell_wave_significant_height: 0.000000
14:00:05 INFO opendrift.models.basemodel:2594: sea_surface_wind_wave_to_direction: 0.000000
14:00:05 INFO opendrift.models.basemodel:2594: sea_surface_wind_wave_mean_period: 0.000000
14:00:05 INFO opendrift.models.basemodel:2594: sea_surface_wind_wave_significant_height: 0.000000
14:00:05 INFO opendrift.models.basemodel:2594: surface_downward_x_stress: 0.000000
14:00:05 INFO opendrift.models.basemodel:2594: surface_downward_y_stress: 0.000000
14:00:05 INFO opendrift.models.basemodel:2594: turbulent_kinetic_energy: 0.000000
14:00:05 INFO opendrift.models.basemodel:2594: turbulent_generic_length_scale: 0.000000
14:00:05 INFO opendrift.models.basemodel:2594: ocean_mixed_layer_thickness: 50.000000
14:00:05 INFO opendrift.models.basemodel:2594: sea_floor_depth_below_sea_level: 10000.000000
14:00:05 INFO opendrift.models.basemodel:1689: No land reader added, making a temporary landmask reader
14:00:11 INFO opendrift.models.basemodel:539: OpenDriftSimulation initialised (version 1.10.7 / v1.10.6-119-g1da5bec)
14:00:11 INFO opendrift.models.basemodel:1713: All points are in ocean
14:00:11 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:03 - step 1 of 30 - 5000 active elements (0 deactivated)
14:00:11 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:03.500000 - step 2 of 30 - 5000 active elements (0 deactivated)
14:00:11 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:04 - step 3 of 30 - 5000 active elements (0 deactivated)
14:00:11 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:04.500000 - step 4 of 30 - 5000 active elements (0 deactivated)
14:00:11 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:05 - step 5 of 30 - 5000 active elements (0 deactivated)
14:00:11 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:05.500000 - step 6 of 30 - 5000 active elements (0 deactivated)
14:00:11 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:06 - step 7 of 30 - 5000 active elements (0 deactivated)
14:00:11 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:06.500000 - step 8 of 30 - 5000 active elements (0 deactivated)
14:00:11 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:07 - step 9 of 30 - 5000 active elements (0 deactivated)
14:00:11 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:07.500000 - step 10 of 30 - 5000 active elements (0 deactivated)
14:00:11 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:08 - step 11 of 30 - 5000 active elements (0 deactivated)
14:00:11 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:08.500000 - step 12 of 30 - 5000 active elements (0 deactivated)
14:00:12 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:09 - step 13 of 30 - 5000 active elements (0 deactivated)
14:00:12 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:09.500000 - step 14 of 30 - 5000 active elements (0 deactivated)
14:00:12 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:10 - step 15 of 30 - 5000 active elements (0 deactivated)
14:00:12 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:10.500000 - step 16 of 30 - 5000 active elements (0 deactivated)
14:00:12 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:11 - step 17 of 30 - 5000 active elements (0 deactivated)
14:00:12 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:11.500000 - step 18 of 30 - 5000 active elements (0 deactivated)
14:00:12 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:12 - step 19 of 30 - 5000 active elements (0 deactivated)
14:00:12 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:12.500000 - step 20 of 30 - 5000 active elements (0 deactivated)
14:00:12 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:13 - step 21 of 30 - 5000 active elements (0 deactivated)
14:00:12 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:13.500000 - step 22 of 30 - 5000 active elements (0 deactivated)
14:00:12 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:14 - step 23 of 30 - 5000 active elements (0 deactivated)
14:00:12 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:14.500000 - step 24 of 30 - 5000 active elements (0 deactivated)
14:00:12 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:15 - step 25 of 30 - 5000 active elements (0 deactivated)
14:00:12 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:15.500000 - step 26 of 30 - 5000 active elements (0 deactivated)
14:00:13 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:16 - step 27 of 30 - 5000 active elements (0 deactivated)
14:00:13 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:16.500000 - step 28 of 30 - 5000 active elements (0 deactivated)
14:00:13 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:17 - step 29 of 30 - 5000 active elements (0 deactivated)
14:00:13 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:17.500000 - step 30 of 30 - 5000 active elements (0 deactivated)
14:00:13 INFO opendrift.models.basemodel:2591: Fallback values will be used for the following variables which have no readers:
14:00:13 INFO opendrift.models.basemodel:2594: x_wind: 0.000000
14:00:13 INFO opendrift.models.basemodel:2594: y_wind: 0.000000
14:00:13 INFO opendrift.models.basemodel:2594: upward_sea_water_velocity: 0.000000
14:00:13 INFO opendrift.models.basemodel:2594: ocean_vertical_diffusivity: 0.000000
14:00:13 INFO opendrift.models.basemodel:2594: sea_surface_wave_significant_height: 0.000000
14:00:13 INFO opendrift.models.basemodel:2594: sea_surface_wave_stokes_drift_x_velocity: 0.000000
14:00:13 INFO opendrift.models.basemodel:2594: sea_surface_wave_stokes_drift_y_velocity: 0.000000
14:00:13 INFO opendrift.models.basemodel:2594: sea_surface_wave_period_at_variance_spectral_density_maximum: 0.000000
14:00:13 INFO opendrift.models.basemodel:2594: sea_surface_wave_mean_period_from_variance_spectral_density_second_frequency_moment: 0.000000
14:00:13 INFO opendrift.models.basemodel:2594: sea_surface_swell_wave_to_direction: 0.000000
14:00:13 INFO opendrift.models.basemodel:2594: sea_surface_swell_wave_peak_period_from_variance_spectral_density: 0.000000
14:00:13 INFO opendrift.models.basemodel:2594: sea_surface_swell_wave_significant_height: 0.000000
14:00:13 INFO opendrift.models.basemodel:2594: sea_surface_wind_wave_to_direction: 0.000000
14:00:13 INFO opendrift.models.basemodel:2594: sea_surface_wind_wave_mean_period: 0.000000
14:00:13 INFO opendrift.models.basemodel:2594: sea_surface_wind_wave_significant_height: 0.000000
14:00:13 INFO opendrift.models.basemodel:2594: surface_downward_x_stress: 0.000000
14:00:13 INFO opendrift.models.basemodel:2594: surface_downward_y_stress: 0.000000
14:00:13 INFO opendrift.models.basemodel:2594: turbulent_kinetic_energy: 0.000000
14:00:13 INFO opendrift.models.basemodel:2594: turbulent_generic_length_scale: 0.000000
14:00:13 INFO opendrift.models.basemodel:2594: ocean_mixed_layer_thickness: 50.000000
14:00:13 INFO opendrift.models.basemodel:2594: sea_floor_depth_below_sea_level: 10000.000000
14:00:13 INFO opendrift.models.basemodel:2654: Backwards simulation, starting from last seeded element
14:00:13 INFO opendrift.models.basemodel:2774: Backwards simulation, starting at time of last seeded element
14:00:13 INFO opendrift.models.basemodel:1689: No land reader added, making a temporary landmask reader
14:00:13 INFO opendrift.models.basemodel:539: OpenDriftSimulation initialised (version 1.10.7 / v1.10.6-119-g1da5bec)
14:00:13 INFO opendrift.models.basemodel:1713: All points are in ocean
14:00:13 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:18 - step 1 of 30 - 5000 active elements (0 deactivated)
14:00:13 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:17.500000 - step 2 of 30 - 5000 active elements (0 deactivated)
14:00:13 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:17 - step 3 of 30 - 5000 active elements (0 deactivated)
14:00:14 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:16.500000 - step 4 of 30 - 5000 active elements (0 deactivated)
14:00:14 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:16 - step 5 of 30 - 5000 active elements (0 deactivated)
14:00:14 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:15.500000 - step 6 of 30 - 5000 active elements (0 deactivated)
14:00:14 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:15 - step 7 of 30 - 5000 active elements (0 deactivated)
14:00:14 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:14.500000 - step 8 of 30 - 5000 active elements (0 deactivated)
14:00:14 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:14 - step 9 of 30 - 5000 active elements (0 deactivated)
14:00:14 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:13.500000 - step 10 of 30 - 5000 active elements (0 deactivated)
14:00:14 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:13 - step 11 of 30 - 5000 active elements (0 deactivated)
14:00:14 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:12.500000 - step 12 of 30 - 5000 active elements (0 deactivated)
14:00:14 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:12 - step 13 of 30 - 5000 active elements (0 deactivated)
14:00:14 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:11.500000 - step 14 of 30 - 5000 active elements (0 deactivated)
14:00:14 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:11 - step 15 of 30 - 5000 active elements (0 deactivated)
14:00:14 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:10.500000 - step 16 of 30 - 5000 active elements (0 deactivated)
14:00:15 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:10 - step 17 of 30 - 5000 active elements (0 deactivated)
14:00:15 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:09.500000 - step 18 of 30 - 5000 active elements (0 deactivated)
14:00:15 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:09 - step 19 of 30 - 5000 active elements (0 deactivated)
14:00:15 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:08.500000 - step 20 of 30 - 5000 active elements (0 deactivated)
14:00:15 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:08 - step 21 of 30 - 5000 active elements (0 deactivated)
14:00:15 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:07.500000 - step 22 of 30 - 5000 active elements (0 deactivated)
14:00:15 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:07 - step 23 of 30 - 5000 active elements (0 deactivated)
14:00:15 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:06.500000 - step 24 of 30 - 5000 active elements (0 deactivated)
14:00:15 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:06 - step 25 of 30 - 5000 active elements (0 deactivated)
14:00:15 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:05.500000 - step 26 of 30 - 5000 active elements (0 deactivated)
14:00:15 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:05 - step 27 of 30 - 5000 active elements (0 deactivated)
14:00:15 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:04.500000 - step 28 of 30 - 5000 active elements (0 deactivated)
14:00:15 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:04 - step 29 of 30 - 5000 active elements (0 deactivated)
14:00:15 INFO opendrift.models.basemodel:2882: 2000-01-01 00:00:03.500000 - step 30 of 30 - 5000 active elements (0 deactivated)
These plots should reproduce Mov 12 on this page: https://shaddenlab.berkeley.edu/uploads/LCS-tutorial/examples.html
plt.subplot(2,1,1)
plt.imshow(lcs['RLCS'][0,:,:], interpolation='nearest', cmap='jet', origin='lower')
plt.colorbar()
plt.title('Repelling LCS (forwards)')
plt.subplot(2,1,2)
plt.imshow(lcs['ALCS'][0,:,:], interpolation='nearest', cmap='jet', origin='lower')
plt.colorbar()
plt.title('Attracting LCS (backwards)')
plt.show()

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