33import numpy as np
44from pathlib import Path
55import os
6+ import xarray as xr
67
78import numpy .testing as nt
89
1314quad_hex_node_data = current_path / 'meshfiles' / "ugrid" / "quad-hexagon" / 'random-node-data.nc'
1415cube_sphere_grid = current_path / "meshfiles" / "ugrid" / "outCSne30" / "outCSne30.ug"
1516
17+
18+ csne8_grid = current_path / "meshfiles" / "scrip" / "ne30pg2" / "grid.nc"
19+ csne8_data = current_path / "meshfiles" / "scrip" / "ne30pg2" / "data.nc"
20+
21+
22+
23+
1624from uxarray .grid .intersections import constant_lat_intersections_face_bounds
1725
1826
1927
2028
2129
22- def test_constant_lat_cross_section_grid ():
30+ def test_constant_lat_subset_grid ():
2331 uxgrid = ux .open_grid (quad_hex_grid_path )
2432
25- grid_top_two = uxgrid .cross_section .constant_latitude (lat = 0.1 )
33+ grid_top_two = uxgrid .subset .constant_latitude (lat = 0.1 )
2634 assert grid_top_two .n_face == 2
2735
28- grid_bottom_two = uxgrid .cross_section .constant_latitude (lat = - 0.1 )
36+ grid_bottom_two = uxgrid .subset .constant_latitude (lat = - 0.1 )
2937 assert grid_bottom_two .n_face == 2
3038
31- grid_all_four = uxgrid .cross_section .constant_latitude (lat = 0.0 )
39+ grid_all_four = uxgrid .subset .constant_latitude (lat = 0.0 )
3240 assert grid_all_four .n_face == 4
3341
3442 with pytest .raises (ValueError ):
35- uxgrid .cross_section .constant_latitude (lat = 10.0 )
43+ uxgrid .subset .constant_latitude (lat = 10.0 )
3644
37- def test_constant_lon_cross_section_grid ():
45+ def test_constant_lon_subset_grid ():
3846 uxgrid = ux .open_grid (quad_hex_grid_path )
3947
40- grid_left_two = uxgrid .cross_section .constant_longitude (lon = - 0.1 )
48+ grid_left_two = uxgrid .subset .constant_longitude (lon = - 0.1 )
4149 assert grid_left_two .n_face == 2
4250
43- grid_right_two = uxgrid .cross_section .constant_longitude (lon = 0.2 )
51+ grid_right_two = uxgrid .subset .constant_longitude (lon = 0.2 )
4452 assert grid_right_two .n_face == 2
4553
4654 with pytest .raises (ValueError ):
47- uxgrid .cross_section .constant_longitude (lon = 10.0 )
55+ uxgrid .subset .constant_longitude (lon = 10.0 )
4856
49- def test_constant_lat_cross_section_uxds ():
57+ def test_constant_lat_subset_uxds ():
5058 uxds = ux .open_dataset (quad_hex_grid_path , quad_hex_data_path )
5159 uxds .uxgrid .normalize_cartesian_coordinates ()
5260
53- da_top_two = uxds ['t2m' ].cross_section .constant_latitude (lat = 0.1 )
61+ da_top_two = uxds ['t2m' ].subset .constant_latitude (lat = 0.1 )
5462 np .testing .assert_array_equal (da_top_two .data , uxds ['t2m' ].isel (n_face = [1 , 2 ]).data )
5563
56- da_bottom_two = uxds ['t2m' ].cross_section .constant_latitude (lat = - 0.1 )
64+ da_bottom_two = uxds ['t2m' ].subset .constant_latitude (lat = - 0.1 )
5765 np .testing .assert_array_equal (da_bottom_two .data , uxds ['t2m' ].isel (n_face = [0 , 3 ]).data )
5866
59- da_all_four = uxds ['t2m' ].cross_section .constant_latitude (lat = 0.0 )
67+ da_all_four = uxds ['t2m' ].subset .constant_latitude (lat = 0.0 )
6068 np .testing .assert_array_equal (da_all_four .data , uxds ['t2m' ].data )
6169
6270 with pytest .raises (ValueError ):
63- uxds ['t2m' ].cross_section .constant_latitude (lat = 10.0 )
71+ uxds ['t2m' ].subset .constant_latitude (lat = 10.0 )
6472
65- def test_constant_lon_cross_section_uxds ():
73+ def test_constant_lon_subset_uxds ():
6674 uxds = ux .open_dataset (quad_hex_grid_path , quad_hex_data_path )
6775 uxds .uxgrid .normalize_cartesian_coordinates ()
6876
69- da_left_two = uxds ['t2m' ].cross_section .constant_longitude (lon = - 0.1 )
77+ da_left_two = uxds ['t2m' ].subset .constant_longitude (lon = - 0.1 )
7078 np .testing .assert_array_equal (da_left_two .data , uxds ['t2m' ].isel (n_face = [0 , 2 ]).data )
7179
72- da_right_two = uxds ['t2m' ].cross_section .constant_longitude (lon = 0.2 )
80+ da_right_two = uxds ['t2m' ].subset .constant_longitude (lon = 0.2 )
7381 np .testing .assert_array_equal (da_right_two .data , uxds ['t2m' ].isel (n_face = [1 , 3 ]).data )
7482
7583 with pytest .raises (ValueError ):
76- uxds ['t2m' ].cross_section .constant_longitude (lon = 10.0 )
84+ uxds ['t2m' ].subset .constant_longitude (lon = 10.0 )
7785
7886def test_north_pole ():
7987 uxgrid = ux .open_grid (cube_sphere_grid )
8088 lats = [89.85 , 89.9 , 89.95 , 89.99 ]
8189
8290 for lat in lats :
83- cross_grid = uxgrid .cross_section .constant_latitude (lat = lat )
91+ cross_grid = uxgrid .subset .constant_latitude (lat = lat )
8492 assert cross_grid .n_face == 4
8593
8694def test_south_pole ():
8795 uxgrid = ux .open_grid (cube_sphere_grid )
8896 lats = [- 89.85 , - 89.9 , - 89.95 , - 89.99 ]
8997
9098 for lat in lats :
91- cross_grid = uxgrid .cross_section .constant_latitude (lat = lat )
99+ cross_grid = uxgrid .subset .constant_latitude (lat = lat )
92100 assert cross_grid .n_face == 4
93101
94102def test_constant_lat ():
@@ -130,39 +138,39 @@ def test_const_lat_interval_da():
130138 uxds = ux .open_dataset (quad_hex_grid_path , quad_hex_data_path )
131139 uxds .uxgrid .normalize_cartesian_coordinates ()
132140
133- res = uxds ['t2m' ].cross_section .constant_latitude_interval (lats = (- 10 , 10 ))
141+ res = uxds ['t2m' ].subset .constant_latitude_interval (lats = (- 10 , 10 ))
134142
135143 assert len (res ) == 4
136144
137145
138146def test_const_lat_interval_grid ():
139147 uxgrid = ux .open_grid (quad_hex_grid_path )
140148
141- res = uxgrid .cross_section .constant_latitude_interval (lats = (- 10 , 10 ))
149+ res = uxgrid .subset .constant_latitude_interval (lats = (- 10 , 10 ))
142150
143151 assert res .n_face == 4
144152
145- res , indices = uxgrid .cross_section .constant_latitude_interval (lats = (- 10 , 10 ), return_face_indices = True )
153+ res , indices = uxgrid .subset .constant_latitude_interval (lats = (- 10 , 10 ), return_face_indices = True )
146154
147155 assert len (indices ) == 4
148156
149157def test_const_lon_interva_da ():
150158 uxds = ux .open_dataset (quad_hex_grid_path , quad_hex_data_path )
151159 uxds .uxgrid .normalize_cartesian_coordinates ()
152160
153- res = uxds ['t2m' ].cross_section .constant_longitude_interval (lons = (- 10 , 10 ))
161+ res = uxds ['t2m' ].subset .constant_longitude_interval (lons = (- 10 , 10 ))
154162
155163 assert len (res ) == 4
156164
157165
158166def test_const_lon_interval_grid ():
159167 uxgrid = ux .open_grid (quad_hex_grid_path )
160168
161- res = uxgrid .cross_section .constant_longitude_interval (lons = (- 10 , 10 ))
169+ res = uxgrid .subset .constant_longitude_interval (lons = (- 10 , 10 ))
162170
163171 assert res .n_face == 4
164172
165- res , indices = uxgrid .cross_section .constant_longitude_interval (lons = (- 10 , 10 ), return_face_indices = True )
173+ res , indices = uxgrid .subset .constant_longitude_interval (lons = (- 10 , 10 ), return_face_indices = True )
166174
167175 assert len (indices ) == 4
168176
@@ -185,22 +193,49 @@ def test_latitude_along_arc(self):
185193
186194
187195
188- def test_double_cross_section ():
196+ def test_double_subset ():
189197 uxgrid = ux .open_grid (quad_hex_grid_path )
190198
191199 # construct edges
192- sub_lat = uxgrid .cross_section .constant_latitude (0.0 )
200+ sub_lat = uxgrid .subset .constant_latitude (0.0 )
193201
194- sub_lat_lon = sub_lat .cross_section .constant_longitude (0.0 )
202+ sub_lat_lon = sub_lat .subset .constant_longitude (0.0 )
195203
196204 assert "n_edge" not in sub_lat_lon ._ds .dims
197205
198206 _ = uxgrid .face_edge_connectivity
199207 _ = uxgrid .edge_node_connectivity
200208 _ = uxgrid .edge_lon
201209
202- sub_lat = uxgrid .cross_section .constant_latitude (0.0 )
210+ sub_lat = uxgrid .subset .constant_latitude (0.0 )
203211
204- sub_lat_lon = sub_lat .cross_section .constant_longitude (0.0 )
212+ sub_lat_lon = sub_lat .subset .constant_longitude (0.0 )
205213
206214 assert "n_edge" in sub_lat_lon ._ds .dims
215+
216+
217+ def test_cross_section ():
218+ uxds = ux .open_dataset (csne8_grid , csne8_data )
219+
220+ # Tributary GCA
221+ ss_gca = uxds ['RELHUM' ].cross_section (start = (- 45 , - 45 ), end = (45 , 45 ))
222+ assert isinstance (ss_gca , xr .DataArray )
223+
224+ # Constant Latitude
225+ ss_clat = uxds ['RELHUM' ].cross_section (lat = 45 )
226+ assert isinstance (ss_clat , xr .DataArray )
227+
228+ # Constat Longitude
229+ ss_clon = uxds ['RELHUM' ].cross_section (lon = 45 )
230+ assert isinstance (ss_clon , xr .DataArray )
231+
232+ # Constat Longitude with increased samples
233+ ss_clon = uxds ['RELHUM' ].cross_section (lon = 45 , steps = 3 )
234+ assert isinstance (ss_clon , xr .DataArray )
235+
236+
237+ with pytest .raises (ValueError ):
238+ _ = uxds ['RELHUM' ].cross_section (end = (45 , 45 ))
239+ _ = uxds ['RELHUM' ].cross_section (start = (45 , 45 ))
240+ _ = uxds ['RELHUM' ].cross_section (lon = 45 , end = (45 , 45 ))
241+ _ = uxds ['RELHUM' ].cross_section ()
0 commit comments