@@ -1670,7 +1670,7 @@ def spectrum_lonlat(self, grid_name, area=None, ref=None, **kwargs):
1670
1670
(lat_content [0 ], lat_content [1 ] / ref_lat_content [1 ]),
1671
1671
)
1672
1672
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 ):
1674
1674
if not isinstance (schema , int ) and schema < 1 :
1675
1675
raise Exception ("schema must be a positive int" )
1676
1676
@@ -1694,13 +1694,16 @@ def compute_finite_difference(self, data, schema=1, mode="reflect", vertical=Fal
1694
1694
data2 [:schema ] = nan
1695
1695
1696
1696
# Distance for one degree
1697
- d = self .EARTH_RADIUS * 2 * pi / 360
1697
+ d = self .EARTH_RADIUS * 2 * pi / 360 * 2 * schema
1698
1698
# Mulitply by 2 step
1699
1699
if vertical :
1700
- d *= self .ystep * 2 * schema
1700
+ d *= self .ystep
1701
1701
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
1704
1707
1705
1708
def compute_stencil (
1706
1709
self , data , stencil_halfwidth = 4 , mode = "reflect" , vertical = False
@@ -1787,13 +1790,14 @@ def compute_stencil(
1787
1790
)
1788
1791
return ma .array (g , mask = m )
1789
1792
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 )
1792
1795
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 )
1794
1798
sl = slice (i_start , i_end )
1795
1799
# Divide by sideral day
1796
- lat = self .y_c [ sl ]
1800
+ lat = self .y_c
1797
1801
gob = (
1798
1802
cos (deg2rad (lat ))
1799
1803
* ones ((self .x_c .shape [0 ], 1 ))
@@ -1807,39 +1811,26 @@ def add_uv_lagerloef(self, grid_height, uname="u", vname="v", schema=15):
1807
1811
mode = "wrap" if self .is_circular () else "reflect"
1808
1812
1809
1813
# 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 )
1824
1816
v_lagerloef = (
1825
1817
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
+ )
1838
1821
* gob
1839
1822
)
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 )
1843
1834
1844
1835
def add_uv (self , grid_height , uname = "u" , vname = "v" , stencil_halfwidth = 4 ):
1845
1836
r"""Compute a u and v grid
0 commit comments