File: bufr_attributes.c

package info (click to toggle)
eccodes 2.20.0-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 400,332 kB
  • sloc: ansic: 167,977; makefile: 21,348; sh: 10,719; f90: 5,927; python: 4,831; perl: 3,031; javascript: 1,427; yacc: 818; lex: 356; awk: 66
file content (140 lines) | stat: -rw-r--r-- 5,544 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/*
 * (C) Copyright 2005- ECMWF.
 *
 * This software is licensed under the terms of the Apache Licence Version 2.0
 * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
 *
 * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
 * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
 */

/*
 * C Implementation: bufr_attributes
 *
 * Description: how to read attributes of keys in BUFR messages.
 *
 */

#include "eccodes.h"


int main(int argc, char* argv[])
{
    FILE* in = NULL;

    /* message handle. Required in all the eccodes calls acting on a message.*/
    codes_handle* h = NULL;

    char* units        = NULL;
    char* unitsPercent = NULL;
    long longVal;
    double doubleVal;
    size_t len         = 0;
    int err            = 0;
    int cnt            = 0;
    const char* infile = "../../data/bufr/syno_multi.bufr";

    in = fopen(infile, "rb");
    if (!in) {
        fprintf(stderr, "Error: unable to open file %s\n", infile);
        return 1;
    }

    /* loop over the messages in the bufr file */
    while ((h = codes_handle_new_from_file(NULL, in, PRODUCT_BUFR, &err)) != NULL || err != CODES_SUCCESS) {
        if (h == NULL) {
            fprintf(stderr, "Error: unable to create handle for message %d\n", cnt);
            cnt++;
            continue;
        }

        printf("message: %d\n", cnt);

        /* we need to instruct ecCodes to expand the descriptors
          i.e. unpack the data values */
        CODES_CHECK(codes_set_long(h, "unpack", 1), 0);

        /* ----------------------------------------------------------------
           We will read the value and all the attributes available for
           the 2m temperature.
        -------------------------------------------------------------------*/

        /* get the value as double */
        CODES_CHECK(codes_get_double(h, "airTemperatureAt2M", &doubleVal), 0);
        printf("  airTemperatureAt2M: %.2f\n", doubleVal);

        /* get the element's code (see BUFR code table B) */
        CODES_CHECK(codes_get_long(h, "airTemperatureAt2M->code", &longVal), 0);
        printf("  airTemperatureAt2M->code: %ld\n", longVal);

        /* get the element's units (see BUFR code table B) */

        /* get the size and allocate memory*/
        CODES_CHECK(codes_get_length(h, "airTemperatureAt2M->units", &len), 0);
        units = (char*)malloc(len * sizeof(char));

        /* get the values*/
        codes_get_string(h, "airTemperatureAt2M->units", units, &len);
        printf("  airTemperatureAt2M->units: %s\n", units);

        /* get the element's scale (see BUFR code table B) */
        CODES_CHECK(codes_get_long(h, "airTemperatureAt2M->scale", &longVal), 0);
        printf("  airTemperatureAt2M->scale: %ld\n", longVal);

        /* get the element's reference (see BUFR code table B) */
        CODES_CHECK(codes_get_long(h, "airTemperatureAt2M->reference", &longVal), 0);
        printf("  airTemperatureAt2M->reference: %ld\n", longVal);

        /* get the element's width (see BUFR code table B) */
        CODES_CHECK(codes_get_long(h, "airTemperatureAt2M->width", &longVal), 0);
        printf("  airTemperatureAt2M->width: %ld\n", longVal);

        /* -----------------------------------------------------------------
           The 2m temperature data element in this message has an associated
           field: percentConfidence. Its value and attributes can be accessed
           in a similar manner as was shown above for 2m temperature.
           ----------------------------------------------------------------- */

        /* get the value as long */
        CODES_CHECK(codes_get_long(h, "airTemperatureAt2M->percentConfidence", &longVal), 0);
        printf("  airTemperatureAt2M->percentConfidence: %ld\n", longVal);

        /* get the element's code (see BUFR code table B) */
        CODES_CHECK(codes_get_long(h, "airTemperatureAt2M->percentConfidence->code", &longVal), 0);
        printf("  airTemperatureAt2M->percentConfidence->code: %ld\n", longVal);

        /* get the element's units (see BUFR code table B) */

        /* get the size and allocate memory*/
        CODES_CHECK(codes_get_length(h, "airTemperatureAt2M->percentConfidence->units", &len), 0);
        unitsPercent = (char*)malloc(len * sizeof(char));

        /* get the values*/
        codes_get_string(h, "airTemperatureAt2M->percentConfidence->units", unitsPercent, &len);
        printf("  airTemperatureAt2M->percentConfidence->units: %s\n", unitsPercent);

        /* get the element's scale (see BUFR code table B) */
        CODES_CHECK(codes_get_long(h, "airTemperatureAt2M->percentConfidence->scale", &longVal), 0);
        printf("  airTemperatureAt2M->percentConfidence->scale: %ld\n", longVal);

        /* get the element's reference (see BUFR code table B) */
        CODES_CHECK(codes_get_long(h, "airTemperatureAt2M->percentConfidence->reference", &longVal), 0);
        printf("  airTemperatureAt2M->percentConfidence->reference: %ld\n", longVal);

        /* get the element's width (see BUFR code table B) */
        CODES_CHECK(codes_get_long(h, "airTemperatureAt2M->percentConfidence->width", &longVal), 0);
        printf("  airTemperatureAt2M->percentConfidence->width: %ld\n", longVal);

        /* free allocated arrays */
        free(units);
        free(unitsPercent);

        /* delete handle */
        codes_handle_delete(h);

        cnt++;
    }

    fclose(in);
    return 0;
}