@@ -861,3 +861,145 @@ def encoded_point_dataset():
861861 {"geometry" : "geometry_container" },
862862 )
863863 return ds
864+
865+
866+ # --- Reduced Gaussian Grid test fixtures ---
867+ # A tiny O2 octahedral reduced gaussian grid with 4 latitudes and 40 total points.
868+
869+
870+ def _create_reduced_gaussian_global ():
871+ """Create a small O2 reduced gaussian grid dataset (full global)."""
872+ lat = np .array ([59.44 , 19.47 , - 19.47 , - 59.44 ])
873+ pl = np .array ([8 , 12 , 12 , 8 ], dtype = np .int32 )
874+ total = int (np .sum (pl )) # 40
875+
876+ rng = np .random .default_rng (42 )
877+ temp_data = rng .standard_normal ((1 , 1 , total )).astype (np .float32 )
878+
879+ ds = xr .Dataset (
880+ {
881+ "air_temperature" : xr .DataArray (
882+ temp_data ,
883+ dims = ["time" , "height" , "reduced_gaussian_index" ],
884+ attrs = {
885+ "grid_mapping" : "reduced_gaussian" ,
886+ "coordinates" : "reduced_gaussian_index" ,
887+ "standard_name" : "air_temperature" ,
888+ "units" : "K" ,
889+ },
890+ ),
891+ "reduced_gaussian" : xr .DataArray (
892+ np .int32 (0 ),
893+ attrs = {
894+ "grid_mapping_name" : "reduced_gaussian" ,
895+ "grid_subtype" : "octahedral" ,
896+ "points_per_latitude" : "pl" ,
897+ "latitude_dimension" : "lat" ,
898+ "semi_major_axis" : 6371229.0 ,
899+ "semi_minor_axis" : 6371229.0 ,
900+ },
901+ ),
902+ },
903+ coords = {
904+ "lat" : xr .DataArray (
905+ lat ,
906+ dims = ["lat" ],
907+ attrs = {"standard_name" : "latitude" , "units" : "degrees_north" },
908+ ),
909+ "pl" : xr .DataArray (
910+ pl ,
911+ dims = ["lat" ],
912+ attrs = {"long_name" : "number of points per latitude" },
913+ ),
914+ "reduced_gaussian_index" : xr .DataArray (
915+ np .arange (total , dtype = np .int32 ),
916+ dims = ["reduced_gaussian_index" ],
917+ attrs = {"standard_name" : "reduced_gaussian_index" },
918+ ),
919+ "time" : xr .DataArray (
920+ [0.0 ], dims = ["time" ], attrs = {"units" : "hours since 2024-01-01" }
921+ ),
922+ "height" : xr .DataArray ([2.0 ], dims = ["height" ], attrs = {"units" : "m" }),
923+ },
924+ )
925+ return ds
926+
927+
928+ def _create_reduced_gaussian_land ():
929+ """Create a small O2 reduced gaussian grid with compression by gathering (land subset)."""
930+ global_ds = _create_reduced_gaussian_global ()
931+ land_indices = np .array ([2 , 5 , 10 , 15 , 20 , 25 , 30 , 35 ], dtype = np .int32 )
932+
933+ rng = np .random .default_rng (43 )
934+ temp_data = rng .standard_normal ((1 , 1 , len (land_indices ))).astype (np .float32 )
935+
936+ ds = xr .Dataset (
937+ {
938+ "air_temperature" : xr .DataArray (
939+ temp_data ,
940+ dims = ["time" , "height" , "grid_points" ],
941+ attrs = {
942+ "grid_mapping" : "reduced_gaussian" ,
943+ "coordinates" : "time height reduced_gaussian_index" ,
944+ },
945+ ),
946+ "reduced_gaussian" : global_ds ["reduced_gaussian" ],
947+ },
948+ coords = {
949+ "lat" : global_ds ["lat" ],
950+ "pl" : global_ds ["pl" ],
951+ "reduced_gaussian_index" : global_ds ["reduced_gaussian_index" ],
952+ "grid_points" : xr .DataArray (
953+ land_indices ,
954+ dims = ["grid_points" ],
955+ attrs = {"compress" : "reduced_gaussian_index" },
956+ ),
957+ "time" : global_ds ["time" ],
958+ "height" : global_ds ["height" ],
959+ },
960+ )
961+ return ds
962+
963+
964+ def _create_reduced_gaussian_region ():
965+ """Create a small O2 reduced gaussian grid with compression (regional subset)."""
966+ global_ds = _create_reduced_gaussian_global ()
967+ region_indices = np .array ([8 , 9 , 10 , 11 , 12 , 13 , 14 ], dtype = np .int32 )
968+
969+ rng = np .random .default_rng (44 )
970+ temp_data = rng .standard_normal ((1 , 1 , len (region_indices ))).astype (np .float32 )
971+
972+ ds = xr .Dataset (
973+ {
974+ "air_temperature" : xr .DataArray (
975+ temp_data ,
976+ dims = ["time" , "height" , "grid_points" ],
977+ attrs = {
978+ "grid_mapping" : "reduced_gaussian" ,
979+ "coordinates" : "time height reduced_gaussian_index" ,
980+ },
981+ ),
982+ "reduced_gaussian" : global_ds ["reduced_gaussian" ],
983+ },
984+ coords = {
985+ "lat" : global_ds ["lat" ],
986+ "pl" : global_ds ["pl" ],
987+ "reduced_gaussian_index" : global_ds ["reduced_gaussian_index" ],
988+ "grid_points" : xr .DataArray (
989+ region_indices ,
990+ dims = ["grid_points" ],
991+ attrs = {
992+ "standard_name" : "reduced_gaussian_index" ,
993+ "compress" : "reduced_gaussian_index" ,
994+ },
995+ ),
996+ "time" : global_ds ["time" ],
997+ "height" : global_ds ["height" ],
998+ },
999+ )
1000+ return ds
1001+
1002+
1003+ reduced_gaussian_global_ds = _create_reduced_gaussian_global ()
1004+ reduced_gaussian_land_ds = _create_reduced_gaussian_land ()
1005+ reduced_gaussian_region_ds = _create_reduced_gaussian_region ()
0 commit comments