Eulerian diagnostics computation

Contents

Eulerian diagnostics computation#

Tutorial to compute Eulerian diagnostics from a velocity field:

  • Kinetic energy (KE)

  • Okubo–Weiss parameter

The Diagnostics.Eulerian class contains functions to:

  • loop over the different diagnostics (diag)

  • compute kinetic energy (KE)

  • compute the Okubo–Weiss parameter (OW)


How to run#

out = Diagnostics.Eulerian(field, dayv).diag(
    diag=[''],
    UVunit,
    delta,
    lon,
    lat
)

Inputs#

  • field : field object containing u and v

  • dayv : date (‘%Y-%m-%d’) for the velocity field

  • diag : list of diagnostics to be computed

  • UVunit : velocity unit required to compute diagnostics (usually cm/s)

  • delta : horizontal grid step for outputs

  • lon, lat : limits of the domain [lonmin, lonmax] and [latmin, latmax]

Outputs:

  • out = array containing all the diagnostics and associated variables

  • out[0] = first diag: out[0][‘lon’], out[0][‘lat’],out[0][‘var0’]

  • out[1] = second diag (if applies): out[1][‘lon’], out[1][‘lat’],out[1][‘var1’]

Import librairies

from lamta.Diagnostics import Eulerian
from lamta.Load_nc import loadCMEMSuv
import matplotlib.pyplot as plt
import numpy as np
import cmocean as cm_oc
import cartopy.crs as ccrs
import cartopy.feature as cfeature

Load Field from netcdf

from pathlib import Path

from lamta_examples.data_fetch import ensure_dataset
from lamta.Load_nc import loadCMEMSuv
from lamta.Diagnostics import Eulerian

DATA_DIR = Path(
    ensure_dataset("altimetry_nrt_global_20220909-20220929.tar.gz")
)

rep = str(DATA_DIR / "altimetry" / "nrt_global") + "/"

all_days = ['20220928','20220929']
varn = {'longitude':'longitude','latitude':'latitude','u':'ugos','v':'vgos'}
field = loadCMEMSuv(all_days,rep,varn,unit='cm/s') # load u,v in cm/s
dayv = '2022-09-29'
delta0 = 0.01
loni = [-2,9]
lati = [35.5,44.5]

# compute Eulerian diagnostics
out = Eulerian(field,dayv).diag(diag=['KE','OW'],UVunit='cm/s',delta=delta0,
                                lon=loni,lat=lati)
import numpy as np
import matplotlib.pyplot as plt

import cartopy.crs as ccrs
import cartopy.feature as cfeature
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
from matplotlib.ticker import MultipleLocator

# Eulerian outputs
KE = out[0]  # kinetic energy
OW = out[1]  # okubo-weiss

# Domain (same as your Basemap call)
lon_min, lon_max = 2, 9
lat_min, lat_max = 40, 44

# -------------------------
# Kinetic Energy (Cartopy)
# -------------------------
fig = plt.figure()
ax = plt.axes(projection=ccrs.Mercator())
ax.set_extent([lon_min, lon_max, lat_min, lat_max], crs=ccrs.PlateCarree())

# Background like fillcontinents + coastlines
ax.add_feature(cfeature.LAND, facecolor="0.83", edgecolor="none", zorder=2)
ax.add_feature(cfeature.COASTLINE, linewidth=0.8, zorder=3)

pcm = ax.pcolormesh(
    KE["lon"], KE["lat"], KE["KE"],
    transform=ccrs.PlateCarree(),
    cmap=cm_oc.cm.thermal,
    vmin=0, vmax=1000,
    zorder=1,
    shading="auto",
)

gl = ax.gridlines(
    crs=ccrs.PlateCarree(),
    draw_labels=True,
    linewidth=0.5,
    linestyle="--",
    color="0.5",
)
gl.top_labels = False
gl.right_labels = False
gl.xformatter = LONGITUDE_FORMATTER
gl.yformatter = LATITUDE_FORMATTER
gl.xlocator = MultipleLocator(2)
gl.ylocator = MultipleLocator(2)

plt.colorbar(pcm, ax=ax)
ax.set_title("Kinetic energy")
plt.show()

# -------------------------
# Okubo–Weiss (Cartopy)
# -------------------------
fig = plt.figure()
ax = plt.axes(projection=ccrs.Mercator())
ax.set_extent([lon_min, lon_max, lat_min, lat_max], crs=ccrs.PlateCarree())

ax.add_feature(cfeature.LAND, facecolor="0.83", edgecolor="none", zorder=2)
ax.add_feature(cfeature.COASTLINE, linewidth=0.8, zorder=3)

pcm = ax.pcolormesh(
    OW["lon"], OW["lat"], OW["ow"],
    transform=ccrs.PlateCarree(),
    cmap="RdBu_r",
    vmin=-0.4, vmax=0.4,
    zorder=1,
    shading="auto",
)

gl = ax.gridlines(
    crs=ccrs.PlateCarree(),
    draw_labels=True,
    linewidth=0.5,
    linestyle="--",
    color="0.5",
)
gl.top_labels = False
gl.right_labels = False
gl.xformatter = LONGITUDE_FORMATTER
gl.yformatter = LATITUDE_FORMATTER
gl.xlocator = MultipleLocator(2)
gl.ylocator = MultipleLocator(2)

plt.colorbar(pcm, ax=ax)
ax.set_title("Okubo–Weiss parameter")
plt.show()
_images/bb8fb87e451e707e5a96084ea9df503ac36a43282306ecf5f8039636c6a3a05b.png _images/6606fca0277de23444534121e907c6497924dd4097f4070ec9a01730dea14646.png