1 /*
2  * (C) Copyright 2005- ECMWF.
3  *
4  * This software is licensed under the terms of the Apache Licence Version 2.0
5  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
6  *
7  * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
8  * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
9  */
10 
11 /**************************************
12  *  Enrico Fucile
13  **************************************/
14 
15 
16 #include "grib_api_internal.h"
17 /*
18    This is used by make_class.pl
19 
20    START_CLASS_DEF
21    CLASS      = accessor
22    SUPER      = grib_accessor_class_unsigned
23    IMPLEMENTS = unpack_long;pack_long; value_count
24    IMPLEMENTS = init
25    MEMBERS=const char*    productDefinitionTemplateNumber
26    MEMBERS=int            instant
27    END_CLASS_DEF
28 
29  */
30 
31 /* START_CLASS_IMP */
32 
33 /*
34 
35 Don't edit anything between START_CLASS_IMP and END_CLASS_IMP
36 Instead edit values between START_CLASS_DEF and END_CLASS_DEF
37 or edit "accessor.class" and rerun ./make_class.pl
38 
39 */
40 
41 static int pack_long(grib_accessor*, const long* val, size_t* len);
42 static int unpack_long(grib_accessor*, long* val, size_t* len);
43 static int value_count(grib_accessor*, long*);
44 static void init(grib_accessor*, const long, grib_arguments*);
45 static void init_class(grib_accessor_class*);
46 
47 typedef struct grib_accessor_select_step_template
48 {
49     grib_accessor att;
50     /* Members defined in gen */
51     /* Members defined in long */
52     /* Members defined in unsigned */
53     long nbytes;
54     grib_arguments* arg;
55     /* Members defined in select_step_template */
56     const char* productDefinitionTemplateNumber;
57     int instant;
58 } grib_accessor_select_step_template;
59 
60 extern grib_accessor_class* grib_accessor_class_unsigned;
61 
62 static grib_accessor_class _grib_accessor_class_select_step_template = {
63     &grib_accessor_class_unsigned,              /* super                     */
64     "select_step_template",                     /* name                      */
65     sizeof(grib_accessor_select_step_template), /* size                      */
66     0,                                          /* inited */
67     &init_class,                                /* init_class */
68     &init,                                      /* init                      */
69     0,                                          /* post_init                      */
70     0,                                          /* free mem                       */
71     0,                                          /* describes himself         */
72     0,                                          /* get length of section     */
73     0,                                          /* get length of string      */
74     &value_count,                               /* get number of values      */
75     0,                                          /* get number of bytes      */
76     0,                                          /* get offset to bytes           */
77     0,                                          /* get native type               */
78     0,                                          /* get sub_section                */
79     0,                                          /* grib_pack procedures long      */
80     0,                                          /* grib_pack procedures long      */
81     &pack_long,                                 /* grib_pack procedures long      */
82     &unpack_long,                               /* grib_unpack procedures long    */
83     0,                                          /* grib_pack procedures double    */
84     0,                                          /* grib_unpack procedures double  */
85     0,                                          /* grib_pack procedures string    */
86     0,                                          /* grib_unpack procedures string  */
87     0,                                          /* grib_pack array procedures string    */
88     0,                                          /* grib_unpack array procedures string  */
89     0,                                          /* grib_pack procedures bytes     */
90     0,                                          /* grib_unpack procedures bytes   */
91     0,                                          /* pack_expression */
92     0,                                          /* notify_change   */
93     0,                                          /* update_size   */
94     0,                                          /* preferred_size   */
95     0,                                          /* resize   */
96     0,                                          /* nearest_smaller_value */
97     0,                                          /* next accessor    */
98     0,                                          /* compare vs. another accessor   */
99     0,                                          /* unpack only ith value          */
100     0,                                          /* unpack a subarray         */
101     0,                                          /* clear          */
102     0,                                          /* clone accessor          */
103 };
104 
105 
106 grib_accessor_class* grib_accessor_class_select_step_template = &_grib_accessor_class_select_step_template;
107 
108 
init_class(grib_accessor_class * c)109 static void init_class(grib_accessor_class* c)
110 {
111     c->dump                   = (*(c->super))->dump;
112     c->next_offset            = (*(c->super))->next_offset;
113     c->string_length          = (*(c->super))->string_length;
114     c->byte_count             = (*(c->super))->byte_count;
115     c->byte_offset            = (*(c->super))->byte_offset;
116     c->get_native_type        = (*(c->super))->get_native_type;
117     c->sub_section            = (*(c->super))->sub_section;
118     c->pack_missing           = (*(c->super))->pack_missing;
119     c->is_missing             = (*(c->super))->is_missing;
120     c->pack_double            = (*(c->super))->pack_double;
121     c->unpack_double          = (*(c->super))->unpack_double;
122     c->pack_string            = (*(c->super))->pack_string;
123     c->unpack_string          = (*(c->super))->unpack_string;
124     c->pack_string_array      = (*(c->super))->pack_string_array;
125     c->unpack_string_array    = (*(c->super))->unpack_string_array;
126     c->pack_bytes             = (*(c->super))->pack_bytes;
127     c->unpack_bytes           = (*(c->super))->unpack_bytes;
128     c->pack_expression        = (*(c->super))->pack_expression;
129     c->notify_change          = (*(c->super))->notify_change;
130     c->update_size            = (*(c->super))->update_size;
131     c->preferred_size         = (*(c->super))->preferred_size;
132     c->resize                 = (*(c->super))->resize;
133     c->nearest_smaller_value  = (*(c->super))->nearest_smaller_value;
134     c->next                   = (*(c->super))->next;
135     c->compare                = (*(c->super))->compare;
136     c->unpack_double_element  = (*(c->super))->unpack_double_element;
137     c->unpack_double_subarray = (*(c->super))->unpack_double_subarray;
138     c->clear                  = (*(c->super))->clear;
139     c->make_clone             = (*(c->super))->make_clone;
140 }
141 
142 /* END_CLASS_IMP */
143 
init(grib_accessor * a,const long l,grib_arguments * c)144 static void init(grib_accessor* a, const long l, grib_arguments* c)
145 {
146     grib_accessor_select_step_template* self = (grib_accessor_select_step_template*)a;
147     int n                                    = 0;
148 
149     self->productDefinitionTemplateNumber = grib_arguments_get_name(grib_handle_of_accessor(a), c, n++);
150     self->instant                         = grib_arguments_get_long(grib_handle_of_accessor(a), c, n++);
151 }
152 
unpack_long(grib_accessor * a,long * val,size_t * len)153 static int unpack_long(grib_accessor* a, long* val, size_t* len)
154 {
155     *val = 1;
156     return GRIB_SUCCESS;
157 }
158 
pack_long(grib_accessor * a,const long * val,size_t * len)159 static int pack_long(grib_accessor* a, const long* val, size_t* len)
160 {
161     grib_accessor_select_step_template* self = (grib_accessor_select_step_template*)a;
162     long productDefinitionTemplateNumber     = 0;
163     long productDefinitionTemplateNumberNew  = 0;
164 
165     grib_get_long(grib_handle_of_accessor(a), self->productDefinitionTemplateNumber, &productDefinitionTemplateNumber);
166 
167     if (self->instant) {
168         /* Going from continuous or non-continuous interval to a point-in-time (instantaneous) */
169         switch (productDefinitionTemplateNumber) {
170             case 8:
171                 productDefinitionTemplateNumberNew = 0;
172                 break;
173             case 9:
174                 productDefinitionTemplateNumberNew = 5;
175                 break;
176             case 10:
177                 productDefinitionTemplateNumberNew = 6;
178                 break;
179             case 11:
180                 productDefinitionTemplateNumberNew = 1;
181                 break;
182             case 12:
183                 productDefinitionTemplateNumberNew = 2;
184                 break;
185             case 13:
186                 productDefinitionTemplateNumberNew = 3;
187                 break;
188             case 14:
189                 productDefinitionTemplateNumberNew = 4;
190                 break;
191             case 42: /* non-EPS chemical */
192                 productDefinitionTemplateNumberNew = 40;
193                 break;
194             case 43: /* EPS chemical */
195                 productDefinitionTemplateNumberNew = 41;
196                 break;
197             case 46:                                     /* non-EPS aerosol */
198                 productDefinitionTemplateNumberNew = 48; /*44 is deprecated*/
199                 break;
200             case 47: /* EPS aerosol */
201                 productDefinitionTemplateNumberNew = 45;
202                 break;
203             case 67: /* non-EPS chemical distrib func */
204                 productDefinitionTemplateNumberNew = 57;
205                 break;
206             case 68: /* EPS chemical distrib func */
207                 productDefinitionTemplateNumberNew = 58;
208                 break;
209             case 72: /* non-EPS post-processing */
210                 productDefinitionTemplateNumberNew = 70;
211                 break;
212             case 73: /* EPS post-processing */
213                 productDefinitionTemplateNumberNew = 71;
214                 break;
215             case 0:
216             case 1:
217             case 2:
218             case 3:
219             case 4:
220             case 5:
221             case 6:
222             case 7:
223             case 15:
224                 productDefinitionTemplateNumberNew = productDefinitionTemplateNumber;
225                 break;
226             default:
227                 productDefinitionTemplateNumberNew = productDefinitionTemplateNumber;
228                 break;
229         }
230     }
231     else {
232         /* Going from point-in-time (instantaneous) to continuous or non-continuous interval */
233         switch (productDefinitionTemplateNumber) {
234             case 0:
235                 productDefinitionTemplateNumberNew = 8;
236                 break;
237             case 1:
238                 productDefinitionTemplateNumberNew = 11;
239                 break;
240             case 2:
241                 productDefinitionTemplateNumberNew = 12;
242                 break;
243             case 3:
244                 productDefinitionTemplateNumberNew = 13;
245                 break;
246             case 4:
247                 productDefinitionTemplateNumberNew = 14;
248                 break;
249             case 5:
250                 productDefinitionTemplateNumberNew = 9;
251                 break;
252             case 6:
253                 productDefinitionTemplateNumberNew = 10;
254                 break;
255             case 40: /* non-EPS chemical */
256                 productDefinitionTemplateNumberNew = 42;
257                 break;
258             case 41: /* EPS chemical */
259                 productDefinitionTemplateNumberNew = 43;
260                 break;
261             case 48: /* non-EPS aerosol. Note template 44 is deprecated */
262                 productDefinitionTemplateNumberNew = 46;
263                 break;
264             case 45: /* EPS aerosol */
265                 /*productDefinitionTemplateNumberNew = 47;   PDT deprecated */
266                 productDefinitionTemplateNumberNew = 85;
267                 break;
268             case 57: /* non-EPS chemical distrib func */
269                 productDefinitionTemplateNumberNew = 67;
270                 break;
271             case 58: /* EPS chemical distrib func */
272                 productDefinitionTemplateNumberNew = 68;
273                 break;
274             case 70: /* non-EPS post-processing */
275                 productDefinitionTemplateNumberNew = 72;
276                 break;
277             case 71: /* EPS post-processing */
278                 productDefinitionTemplateNumberNew = 73;
279                 break;
280             case 7:
281             case 8:
282             case 9:
283             case 10:
284             case 11:
285             case 12:
286             case 13:
287             case 14:
288                 productDefinitionTemplateNumberNew = productDefinitionTemplateNumber;
289                 break;
290             default:
291                 productDefinitionTemplateNumberNew = productDefinitionTemplateNumber;
292                 break;
293         }
294     }
295 
296     if (productDefinitionTemplateNumber != productDefinitionTemplateNumberNew)
297         grib_set_long(grib_handle_of_accessor(a), self->productDefinitionTemplateNumber, productDefinitionTemplateNumberNew);
298 
299     return 0;
300 }
301 
value_count(grib_accessor * a,long * c)302 static int value_count(grib_accessor* a, long* c)
303 {
304     *c = 1;
305     return 0;
306 }
307