@@ -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