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