Skip to content

Commit d5d3aed

Browse files
committed
correction on lagerloef uv
1 parent 3a54bbb commit d5d3aed

File tree

1 file changed

+29
-38
lines changed

1 file changed

+29
-38
lines changed

src/py_eddy_tracker/dataset/grid.py

Lines changed: 29 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1670,7 +1670,7 @@ def spectrum_lonlat(self, grid_name, area=None, ref=None, **kwargs):
16701670
(lat_content[0], lat_content[1] / ref_lat_content[1]),
16711671
)
16721672

1673-
def compute_finite_difference(self, data, schema=1, mode="reflect", vertical=False):
1673+
def compute_finite_difference(self, data, schema=1, mode="reflect", vertical=False, second=False):
16741674
if not isinstance(schema, int) and schema < 1:
16751675
raise Exception("schema must be a positive int")
16761676

@@ -1694,13 +1694,16 @@ def compute_finite_difference(self, data, schema=1, mode="reflect", vertical=Fal
16941694
data2[:schema] = nan
16951695

16961696
# Distance for one degree
1697-
d = self.EARTH_RADIUS * 2 * pi / 360
1697+
d = self.EARTH_RADIUS * 2 * pi / 360 * 2 * schema
16981698
# Mulitply by 2 step
16991699
if vertical:
1700-
d *= self.ystep * 2 * schema
1700+
d *= self.ystep
17011701
else:
1702-
d *= self.xstep * cos(deg2rad(self.y_c)) * 2 * schema
1703-
return (data1 - data2) / d
1702+
d *= self.xstep * cos(deg2rad(self.y_c))
1703+
if second:
1704+
return (data1 + data2 - 2 * data) / (d ** 2 / 4)
1705+
else:
1706+
return (data1 - data2) / d
17041707

17051708
def compute_stencil(
17061709
self, data, stencil_halfwidth=4, mode="reflect", vertical=False
@@ -1787,13 +1790,14 @@ def compute_stencil(
17871790
)
17881791
return ma.array(g, mask=m)
17891792

1790-
def add_uv_lagerloef(self, grid_height, uname="u", vname="v", schema=15):
1791-
self.add_uv(grid_height, uname, vname)
1793+
def add_uv_lagerloef(self, grid_height, uname="u", vname="v", schema=15, **kwargs):
1794+
self.add_uv(grid_height, uname, vname, **kwargs)
17921795
latmax = 5
1793-
_, (i_start, i_end) = self.nearest_grd_indice((0, 0), (-latmax, latmax))
1796+
_, i_start = self.nearest_grd_indice(0, -latmax)
1797+
_, i_end = self.nearest_grd_indice(0, latmax)
17941798
sl = slice(i_start, i_end)
17951799
# Divide by sideral day
1796-
lat = self.y_c[sl]
1800+
lat = self.y_c
17971801
gob = (
17981802
cos(deg2rad(lat))
17991803
* ones((self.x_c.shape[0], 1))
@@ -1807,39 +1811,26 @@ def add_uv_lagerloef(self, grid_height, uname="u", vname="v", schema=15):
18071811
mode = "wrap" if self.is_circular() else "reflect"
18081812

18091813
# fill data to compute a finite difference on all point
1810-
data = self.convolve_filter_with_dynamic_kernel(
1811-
grid_height,
1812-
self.kernel_bessel,
1813-
lat_max=10,
1814-
wave_length=500,
1815-
order=1,
1816-
extend=0.1,
1817-
)
1818-
data = self.convolve_filter_with_dynamic_kernel(
1819-
data, self.kernel_bessel, lat_max=10, wave_length=500, order=1, extend=0.1
1820-
)
1821-
data = self.convolve_filter_with_dynamic_kernel(
1822-
data, self.kernel_bessel, lat_max=10, wave_length=500, order=1, extend=0.1
1823-
)
1814+
kw_filter = dict(kernel_func=self.kernel_bessel, order=1, extend=.1)
1815+
data = self.convolve_filter_with_dynamic_kernel(grid_height, wave_length=500, **kw_filter, lat_max=6+5+2+3)
18241816
v_lagerloef = (
18251817
self.compute_finite_difference(
1826-
self.compute_finite_difference(data, mode=mode, schema=schema),
1827-
mode=mode,
1828-
schema=schema,
1829-
)[:, sl]
1830-
* gob
1831-
)
1832-
u_lagerloef = (
1833-
-self.compute_finite_difference(
1834-
self.compute_finite_difference(data, vertical=True, schema=schema),
1835-
vertical=True,
1836-
schema=schema,
1837-
)[:, sl]
1818+
self.compute_finite_difference(data, mode=mode, schema=1),
1819+
vertical=True, schema=1
1820+
)
18381821
* gob
18391822
)
1840-
w = 1 - exp(-((lat / 2.2) ** 2))
1841-
self.vars[vname][:, sl] = self.vars[vname][:, sl] * w + v_lagerloef * (1 - w)
1842-
self.vars[uname][:, sl] = self.vars[uname][:, sl] * w + u_lagerloef * (1 - w)
1823+
u_lagerloef = -self.compute_finite_difference(data, vertical=True, schema=schema, second=True) * gob
1824+
1825+
v_lagerloef = self.convolve_filter_with_dynamic_kernel(v_lagerloef, wave_length=195, **kw_filter, lat_max=6 + 5 +2)
1826+
v_lagerloef = self.convolve_filter_with_dynamic_kernel(v_lagerloef, wave_length=416, **kw_filter, lat_max=6 + 5)
1827+
v_lagerloef = self.convolve_filter_with_dynamic_kernel(v_lagerloef, wave_length=416, **kw_filter, lat_max=6)
1828+
u_lagerloef = self.convolve_filter_with_dynamic_kernel(u_lagerloef, wave_length=195, **kw_filter, lat_max=6 + 5 +2)
1829+
u_lagerloef = self.convolve_filter_with_dynamic_kernel(u_lagerloef, wave_length=416, **kw_filter, lat_max=6 + 5)
1830+
u_lagerloef = self.convolve_filter_with_dynamic_kernel(u_lagerloef, wave_length=416, **kw_filter, lat_max=6)
1831+
w = 1 - exp(-((lat[sl] / 2.2) ** 2))
1832+
self.vars[vname][:, sl] = self.vars[vname][:, sl] * w + v_lagerloef[:, sl] * (1 - w)
1833+
self.vars[uname][:, sl] = self.vars[uname][:, sl] * w + u_lagerloef[:, sl] * (1 - w)
18431834

18441835
def add_uv(self, grid_height, uname="u", vname="v", stencil_halfwidth=4):
18451836
r"""Compute a u and v grid

0 commit comments

Comments
 (0)