Advection mode and methods#

Tutorial to define advection options
Mode: backward or forward
Methods: Runga-kutta 1 (RK4 flat)
         Runga-kutta 4  (RK1 flat)

Mode is either controlled by time variable (increasing=forward,
decreasing=backward) or by argument mode = "backward" or "forward"
when initializing particles (ParticleSet)

Methods are defined as functions in Diagnostics.py. New methods
can be implemented directly in Diagnostics.py.

Two examples are provided using different fields and particles
setting.

Import librairies#

import lamta
#print(lamta.__file__)

from lamta.Diagnostics import ParticleSet, Lagrangian
from testFields import peninsula
from lamta.Load_nc import loadCMEMSuv
import numpy as np
import matplotlib.pyplot as plt

import cartopy.crs as ccrs
import cartopy.feature as cfeature
import matplotlib.pyplot as plt

Peninsula case with parcels initialized from inputs

field = peninsula()
# if particles are set "from_input" forward and backward advections can be
# set using increasing or decreasing time values (pt) 
ptf = np.array([0,200]) #forward
ptb = np.array([200,0]) #backward
px = np.array([200,200,200,200])    
py = np.array([15,35,55,75])
numstep = 30
psetf = ParticleSet.from_input(ptf,px,py,fieldset=field, xy="xy") #forward
psetb = ParticleSet.from_input(ptb,px,py,fieldset=field, xy="xy") #backward

lon = np.array(psetf.lon)
lat = np.array(psetf.lat)

# Trajectories with RK1 method
trjff = psetf.rk1flat(Lagrangian.interpf,numstep)
trjfb = psetb.rk1flat(Lagrangian.interpf,numstep)
c:\Users\lloyd\Desktop\lagrangian_dev\LAMTA_examples\notebooks\testFields.py:22: RuntimeWarning: invalid value encountered in scalar divide
  psi[i,j] = (u0*R**2*y[j]/((x[i]-x0)**2 + y[j]**2)) - u0*y[j]
C:\Users\lloyd\Desktop\lagrangian_dev\LAMTA\lamta\Diagnostics.py:1182: UserWarning: Warning: x and y data are not lon/lat
  warnings.warn("Warning: x and y data are not lon/lat")
# Plot trajectories
xf,yf = np.asarray(trjff['trjx']),np.asarray(trjff['trjy'])
xb,yb = np.asarray(trjfb['trjx']),np.asarray(trjfb['trjy'])
col = [[0.9,0.5,0],[0,0,0.7],[0,0.7,0],[0.7,0,0.7]]

fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.contour(field['lon'],field['lat'],field['psi'],levels=np.arange(-80,0,20),colors='red',linewidths=0.5)
ax1.quiver(field['lon'][0:500:20,0:100:8],field['lat'][0:500:20,0:100:8],field['u'][0:500:20,0:100:8],
           field['v'][0:500:20,0:100:8],scale=40)
for i in range(4):
    ax1.plot(xf[:,i],yf[:,i],color=col[i])
    ax1.plot(xf[:,i],yf[:,i],'.',color=col[i])
ax1.plot(trjff['trjx'][0],trjff['trjy'][0],'bx') #initial positions
ax1.set_title('forward')
ax2.contour(field['lon'],field['lat'],field['psi'],levels=np.arange(-80,0,20),colors='red',linewidths=0.5)
ax2.quiver(field['lon'][0:500:20,0:100:8],field['lat'][0:500:20,0:100:8],field['u'][0:500:20,0:100:8],
           field['v'][0:500:20,0:100:8],scale=40)
for i in range(4):
    ax2.plot(xb[:,i],yb[:,i],color=col[i])
    ax2.plot(xb[:,i],yb[:,i],'.',color=col[i])
ax2.plot(trjfb['trjx'][0],trjfb['trjy'][0],'bx') #initial positions
ax2.set_title('backward')
plt.show()
_images/704030a112b202cdb29d274da3d5af774282e9df8434204571053a1aabd8ffa6.png

Ocean case with parcels initialized from grid#

from pathlib import Path
from lamta_examples.data_fetch import ensure_dataset

from lamta.Load_nc import loadCMEMSuv
from lamta.Diagnostics import Lagrangian, ParticleSet

# 1) Ensure dataset is available (download + checksum + extract)
DATA_DIR = ensure_dataset("altimetry_nrt_global_20220909-20220929.tar.gz")
rep = str(DATA_DIR / "altimetry" / "nrt_global") + "/"

# 3) Load field
all_days = [
    "20220919","20220920","20220921","20220922","20220923",
    "20220924","20220925","20220926","20220927","20220928","20220929"
]
varn = {"longitude": "longitude", "latitude": "latitude", "u": "ugos", "v": "vgos"}

field = loadCMEMSuv(all_days, rep, varn, unit="deg/d")

# Particle set from grid
numdays = 10
loni = [5,7]
lati = [41,43]
delta0 = 0.5
dayvb = '2022-09-29' #starting backward advection from 2022-09-29
dayvf = '2022-09-19' #starting forward advection from 2022-09-19
numstep = 20
#if "mode" argument is not defined, default is backward
psetb = ParticleSet.from_grid(numdays,loni,lati,delta0,dayvb,fieldset=field,mode='backward')
psetf = ParticleSet.from_grid(numdays,loni,lati,delta0,dayvf,fieldset=field,mode='forward')

# Trajectories RK4 with u,v from ocean field
trjfb = psetb.rk4flat(Lagrangian.interpf,numstep,coordinates='spherical')
trjff = psetf.rk4flat(Lagrangian.interpf,numstep,coordinates='spherical')
import numpy as np
import matplotlib.pyplot as plt

import cartopy.crs as ccrs
import cartopy.feature as cfeature


# Plot trajectories
# Prepare lon/lat grid
Yg, Xg = np.meshgrid(field['lat'], field['lon'])

u0 = field['u'][0, :, :]
v0 = field['v'][0, :, :]

fig = plt.figure(figsize=(12, 5))

proj = ccrs.Mercator()
data_crs = ccrs.PlateCarree()  # lon/lat data

# =====================
# Forward trajectories
# =====================
ax = fig.add_subplot(1, 2, 1, projection=proj)
ax.set_title("forward")

ax.set_extent([2, 9, 39, 44], crs=data_crs)

# background
ax.add_feature(cfeature.LAND, facecolor="0.83", zorder=0)
ax.add_feature(cfeature.COASTLINE, linewidth=0.8)
ax.add_feature(cfeature.BORDERS, linewidth=0.4)
ax.gridlines(draw_labels=True, linewidth=0.3)

# velocity field
ax.quiver(
    Xg, Yg, u0, v0,
    transform=data_crs,
    scale=5
)

# trajectories
ax.plot(
    trjff['trjx'], trjff['trjy'],
    transform=data_crs
)
ax.plot(
    trjff['trjx'][0], trjff['trjy'][0],
    "rx", transform=data_crs
)

# =====================
# Backward trajectories
# =====================
ax = fig.add_subplot(1, 2, 2, projection=proj)
ax.set_title("backward")

ax.set_extent([2, 9, 39, 44], crs=data_crs)

ax.add_feature(cfeature.LAND, facecolor="0.83", zorder=0)
ax.add_feature(cfeature.COASTLINE, linewidth=0.8)
ax.add_feature(cfeature.BORDERS, linewidth=0.4)
ax.gridlines(draw_labels=True, linewidth=0.3)

ax.quiver(
    Xg, Yg, u0, v0,
    transform=data_crs,
    scale=5
)

ax.plot(
    trjfb['trjx'], trjfb['trjy'],
    transform=data_crs
)
ax.plot(
    trjfb['trjx'][0], trjfb['trjy'][0],
    "rx", transform=data_crs
)

plt.tight_layout()
plt.show()
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
c:\Users\lloyd\miniforge3\envs\lamta_examples\Lib\site-packages\shapely\creation.py:218: RuntimeWarning: invalid value encountered in linestrings
  return lib.linestrings(coords, np.intc(handle_nan), out=out, **kwargs)
_images/afcca6ad7dee2ff963265cba844a81014e7ccddd57f13189187b3f377a6e027e.png