@@ -286,12 +286,55 @@ USFile *grib_open(const char *filename) {
286286 gfile -> fp = fp ;
287287 gfile -> path = strdup (filename );
288288
289+ /* Scan GRIB messages manually by iterating through file */
290+ int capacity = 64 ;
291+ off_t * offsets = malloc (capacity * sizeof (off_t ));
292+ size_t * sizes = malloc (capacity * sizeof (size_t ));
293+ if (!offsets || !sizes ) {
294+ free (offsets );
295+ free (sizes );
296+ free (gfile -> path );
297+ free (gfile );
298+ fclose (fp );
299+ return NULL ;
300+ }
301+
289302 int num = 0 ;
290- off_t * offsets = NULL ;
291- size_t * sizes = NULL ;
292- int rc = codes_extract_offsets_sizes_malloc (NULL , filename , PRODUCT_GRIB , & offsets , & sizes , & num , 0 );
293- if (rc != CODES_SUCCESS || num <= 0 ) {
294- fprintf (stderr , "Failed to scan GRIB messages in %s\n" , filename );
303+ int err = 0 ;
304+ codes_handle * h = NULL ;
305+
306+ rewind (fp );
307+ while ((h = codes_handle_new_from_file (NULL , fp , PRODUCT_GRIB , & err )) != NULL ) {
308+ if (num >= capacity ) {
309+ capacity *= 2 ;
310+ off_t * new_offsets = realloc (offsets , capacity * sizeof (off_t ));
311+ size_t * new_sizes = realloc (sizes , capacity * sizeof (size_t ));
312+ if (!new_offsets || !new_sizes ) {
313+ free (new_offsets ? new_offsets : offsets );
314+ free (new_sizes ? new_sizes : sizes );
315+ codes_handle_delete (h );
316+ free (gfile -> path );
317+ free (gfile );
318+ fclose (fp );
319+ return NULL ;
320+ }
321+ offsets = new_offsets ;
322+ sizes = new_sizes ;
323+ }
324+
325+ /* Get message offset and size */
326+ off_t msg_offset = 0 ;
327+ size_t msg_size = 0 ;
328+ codes_get_message_offset (h , & msg_offset );
329+ codes_get_message_size (h , & msg_size );
330+ offsets [num ] = msg_offset ;
331+ sizes [num ] = msg_size ;
332+ num ++ ;
333+ codes_handle_delete (h );
334+ }
335+
336+ if (num <= 0 ) {
337+ fprintf (stderr , "No GRIB messages found in %s\n" , filename );
295338 free (offsets );
296339 free (sizes );
297340 free (gfile -> path );
@@ -675,9 +718,15 @@ static USVar *build_var_from_group(USFile *file, USMesh *mesh, const GribVarGrou
675718 var -> n_dims ++ ;
676719 }
677720
678- if (is_multi_level ) {
721+ /* Always add depth dimension for GRIB to show level info */
722+ if (group -> n_levels > 0 ) {
679723 var -> depth_dim_id = var -> n_dims ;
680- strncpy (var -> dim_names [var -> n_dims ], GRIB_DEPTH_DIM_NAME , MAX_NAME_LEN - 1 );
724+ /* Use type_of_level as dimension name (e.g., "surface", "depthBelowLandLayer") */
725+ if (group -> type_of_level [0 ]) {
726+ strncpy (var -> dim_names [var -> n_dims ], group -> type_of_level , MAX_NAME_LEN - 1 );
727+ } else {
728+ strncpy (var -> dim_names [var -> n_dims ], GRIB_DEPTH_DIM_NAME , MAX_NAME_LEN - 1 );
729+ }
681730 var -> dim_sizes [var -> n_dims ] = group -> n_levels ;
682731 var -> n_dims ++ ;
683732 }
@@ -806,20 +855,10 @@ USVar *grib_scan_variables(USFile *file, USMesh *mesh) {
806855 free (infos );
807856
808857 int is_multi_level = (group -> n_levels > 1 );
809- char name_buf [MAX_NAME_LEN ] = {0 };
810- if (!is_multi_level ) {
811- long level = (group -> n_levels > 0 ) ? (long )group -> levels [0 ] : 0 ;
812- if (group -> type_of_level [0 ]) {
813- snprintf (name_buf , sizeof (name_buf ), "%s@%s=%ld" ,
814- group -> short_name , group -> type_of_level , level );
815- } else {
816- snprintf (name_buf , sizeof (name_buf ), "%s@level=%ld" ,
817- group -> short_name , level );
818- }
819- }
820858
859+ /* Always use short_name as variable name, show level in depth */
821860 USVar * var = build_var_from_group (file , mesh , group ,
822- is_multi_level ? NULL : name_buf ,
861+ NULL , /* use short_name */
823862 is_multi_level );
824863 if (!var ) continue ;
825864
0 commit comments