Skip to content

Commit 1380cd8

Browse files
authored
Merge pull request #17 from CliDyn/grib
Make GRIB beautiful
2 parents 9f4c968 + de15833 commit 1380cd8

File tree

2 files changed

+61
-21
lines changed

2 files changed

+61
-21
lines changed

src/file_grib.c

Lines changed: 58 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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

src/ushow.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,9 @@ static void on_var_select(int var_index) {
8686
current_var = var;
8787
view_set_variable(view, var, mesh, regrid);
8888

89-
/* Update UI */
90-
x_update_var_name(var->name);
89+
/* Update UI - use long_name if available, otherwise name */
90+
const char *display_name = (var->long_name[0]) ? var->long_name : var->name;
91+
x_update_var_name(display_name);
9192
x_update_range_label(var->user_min, var->user_max);
9293
x_update_time(view->time_index, view->n_times);
9394
x_update_depth(view->depth_index, view->n_depths);

0 commit comments

Comments
 (0)