bufr2synop 0.24.0
Functions
bufr2tac_x13.c File Reference

decodes the descriptors with X = 13 . Precipitation and hidrology More...

#include "bufr2tac.h"
Include dependency graph for bufr2tac_x13.c:

Go to the source code of this file.

Functions

char * prec_to_RRR (char *target, double r)
 converts a precipitation in Kg/m2 into a RRR string More...
 
char * prec_to_RRRR (char *target, double r)
 converts a precipitation in Kg/m2 into a RRRR string (code table 3596) More...
 
char * prec_to_RRRR24 (char *target, double r)
 converts a precipitation in Kg/m2 into a RRRR24 string More...
 
char * prec_to_RxRxRxRx (char *target, double r)
 converts a precipitation in Kg/m2 into a RxRxRxRx string More...
 
char * total_snow_depth_to_sss (char *target, double r)
 converts tatal snow depth in m to sss (code table 3889) More...
 
char * recent_snow_to_ss (char *target, double r)
 converts recent snow in m to ss (code table 3870) More...
 
int syn_parse_x13 (struct synop_chunks *syn, struct bufr2tac_subset_state *s)
 Parse a expanded descriptor with X = 13. More...
 
int buoy_parse_x13 (struct buoy_chunks *b, struct bufr2tac_subset_state *s)
 Parse a expanded descriptor with X = 13. More...
 
int climat_parse_x13 (struct climat_chunks *c, struct bufr2tac_subset_state *s)
 Parse a expanded descriptor with X = 13. More...
 

Detailed Description

decodes the descriptors with X = 13 . Precipitation and hidrology

Definition in file bufr2tac_x13.c.

Function Documentation

◆ buoy_parse_x13()

int buoy_parse_x13 ( struct buoy_chunks b,
struct bufr2tac_subset_state s 
)

Parse a expanded descriptor with X = 13.

Parameters
bpointer to a struct buoy_chunks where to set the results
spointer to a struct bufr2tac_subset_state where is stored needed information in sequential analysis

It returns 0 if success, 1 if problems when processing. If a descriptor is not processed returns 0 anyway

Definition at line 877 of file bufr2tac_x13.c.

878{
879
880 if ( s->a->mask & DESCRIPTOR_VALUE_MISSING )
881 {
882 return 0;
883 }
884
885 if ( b == NULL )
886 {
887 return 1;
888 }
889
890
891 switch ( s->a->desc.y )
892 {
893 default:
894 if ( BUFR2TAC_DEBUG_LEVEL > 1 && (s->a->mask & DESCRIPTOR_VALUE_MISSING) == 0 )
895 bufr2tac_set_error ( s, 0, "buoy_parse_x13()", "Descriptor not parsed" );
896 break;
897 }
898 return 0;
899}
int BUFR2TAC_DEBUG_LEVEL
Definition: bufr2tac.c:31
int bufr2tac_set_error(struct bufr2tac_subset_state *s, int severity, char *origin, char *explanation)
#define DESCRIPTOR_VALUE_MISSING
Bit mask for a missing value in a struct bufr_atom_data.
Definition: bufrdeco.h:140
struct bufr_atom_data * a
Definition: bufr2tac.h:249
uint32_t mask
Definition: bufrdeco.h:437
struct bufr_descriptor desc
Definition: bufrdeco.h:436

References bufr2tac_subset_state::a, BUFR2TAC_DEBUG_LEVEL, bufr2tac_set_error(), bufr_atom_data::desc, DESCRIPTOR_VALUE_MISSING, bufr_atom_data::mask, and bufr_descriptor::y.

Referenced by parse_subset_as_buoy().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ climat_parse_x13()

int climat_parse_x13 ( struct climat_chunks c,
struct bufr2tac_subset_state s 
)

Parse a expanded descriptor with X = 13.

Parameters
cpointer to a struct climat_chunks where to set the results
spointer to a struct bufr2tac_subset_state where is stored needed information in sequential analysis

It returns 0 if success, 1 if problems when processing. If a descriptor is not processed returns 0 anyway

Definition at line 909 of file bufr2tac_x13.c.

910{
911
912 if ( s->a->mask & DESCRIPTOR_VALUE_MISSING )
913 {
914 return 0;
915 }
916
917 if ( c == NULL )
918 {
919 return 1;
920 }
921
922
923 switch ( s->a->desc.y )
924 {
925 case 4: // 0 13 004 . Mean vapor pressure in tenths of hectopascal
926 if ( s->is_normal == 0 )
927 {
928 sprintf ( c->s1.eee,"%03d", ( int ) ( s->val * 0.1 + 0.5 ) );
929 c->mask |= CLIMAT_SEC1;
930 }
931 else
932 {
933 sprintf ( c->s2.eee,"%03d", ( int ) ( s->val * 0.1 + 0.5 ) );
934 c->mask |= CLIMAT_SEC2;
935 }
936 break;
937
938 case 51: // 0 13 051 . Frequency group precipitation
939 if ( s->ival >= 0 && s->ival <= 6 )
940 {
941 sprintf ( c->s1.Rd, "%d", s->ival );
942 }
943 break;
944
945 case 52: // 0 13 052 . Highest daily amount of precipitation
946 prec_to_RxRxRxRx ( c->s4.RxRxRxRx, s->val );
947 if ( s->more_days == 0 )
948 {
949 sprintf ( c->s4.yr, "%02d", s->day );
950 }
951 else
952 {
953 sprintf ( c->s4.yr, "%02d", (s->day + 50) % 50 );
954 }
955 c->mask |= CLIMAT_SEC4;
956 break;
957
958 case 60: // 0 13 060 . Total acumulated precipitation
959 if ( s->is_normal == 0 )
960 {
961 prec_to_RRRR ( c->s1.R1R1R1R1, s->val );
962 c->mask |= CLIMAT_SEC1;
963 }
964 else
965 {
966 prec_to_RRRR ( c->s2.R1R1R1R1, s->val );
967 c->mask |= CLIMAT_SEC2;
968 }
969 break;
970
971 default:
972 if ( BUFR2TAC_DEBUG_LEVEL > 1 && (s->a->mask & DESCRIPTOR_VALUE_MISSING) == 0 )
973 bufr2tac_set_error ( s, 0, "climat_parse_x13()", "Descriptor not parsed" );
974 break;
975 }
976 return 0;
977}
char * prec_to_RxRxRxRx(char *target, double r)
converts a precipitation in Kg/m2 into a RxRxRxRx string
Definition: bufr2tac_x13.c:110
char * prec_to_RRRR(char *target, double r)
converts a precipitation in Kg/m2 into a RRRR string (code table 3596)
Definition: bufr2tac_x13.c:64
#define CLIMAT_SEC4
mask bit meaning section 4 of climat is solicited to or parsed with success
Definition: metclimat.h:52
#define CLIMAT_SEC2
mask bit meaning section 2 of climat is solicited to or parsed with success
Definition: metclimat.h:42
#define CLIMAT_SEC1
mask bit meaning section 1 of climat is solicited to or parsed with success
Definition: metclimat.h:37
struct climat_sec4 s4
Definition: metclimat.h:221
struct climat_sec1 s1
Definition: metclimat.h:218
struct climat_sec2 s2
Definition: metclimat.h:219
char R1R1R1R1[6]
Definition: metclimat.h:92
char eee[4]
Definition: metclimat.h:91
char Rd[2]
Definition: metclimat.h:93
char R1R1R1R1[6]
Definition: metclimat.h:123
char eee[4]
Definition: metclimat.h:122
char RxRxRxRx[8]
Definition: metclimat.h:180
char yr[4]
Definition: metclimat.h:181

References bufr2tac_subset_state::a, BUFR2TAC_DEBUG_LEVEL, bufr2tac_set_error(), CLIMAT_SEC1, CLIMAT_SEC2, CLIMAT_SEC4, bufr2tac_subset_state::day, bufr_atom_data::desc, DESCRIPTOR_VALUE_MISSING, climat_sec1::eee, climat_sec2::eee, bufr2tac_subset_state::is_normal, bufr2tac_subset_state::ival, bufr_atom_data::mask, climat_chunks::mask, bufr2tac_subset_state::more_days, prec_to_RRRR(), prec_to_RxRxRxRx(), climat_sec1::R1R1R1R1, climat_sec2::R1R1R1R1, climat_sec1::Rd, climat_sec4::RxRxRxRx, climat_chunks::s1, climat_chunks::s2, climat_chunks::s4, bufr2tac_subset_state::val, bufr_descriptor::y, and climat_sec4::yr.

Referenced by parse_subset_as_climat().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ prec_to_RRR()

char * prec_to_RRR ( char *  target,
double  r 
)

converts a precipitation in Kg/m2 into a RRR string

Parameters
rthe precipitation
targetthe resulting string

Definition at line 32 of file bufr2tac_x13.c.

33{
34 if ( r == 0.0 )
35 {
36 strcpy ( target,"000" );
37 }
38 else if ( r > -0.11 && r < -0.09 ) // this is an approach to -0.1
39 {
40 strcpy ( target,"990" );
41 }
42 else if ( r < 0.95 )
43 {
44 sprintf ( target, "99%d", ( int ) ( r * 10.0 + 0.5 ) );
45 }
46 else if ( r >= 989.0 )
47 {
48 strcpy ( target,"989" );
49 }
50 else
51 {
52 sprintf ( target, "%03d", ( int ) ( r + 0.5 ) );
53 }
54 return target;
55
56}

Referenced by syn_parse_x13().

Here is the caller graph for this function:

◆ prec_to_RRRR()

char * prec_to_RRRR ( char *  target,
double  r 
)

converts a precipitation in Kg/m2 into a RRRR string (code table 3596)

Parameters
rthe precipitation
targetthe resulting string

Definition at line 64 of file bufr2tac_x13.c.

65{
66 if ( r < 0.0 || ( r > 0.0 && r < 0.1 ) )
67 {
68 strcpy ( target,"9999" );
69 }
70 else if ( r <= 8899.0 )
71 {
72 sprintf ( target,"%04d", ( int ) ( r + 0.5 ) );
73 }
74 else
75 {
76 strcpy ( target,"8899" );
77 }
78 return target;
79}

Referenced by climat_parse_x13().

Here is the caller graph for this function:

◆ prec_to_RRRR24()

char * prec_to_RRRR24 ( char *  target,
double  r 
)

converts a precipitation in Kg/m2 into a RRRR24 string

Parameters
rthe precipitation
targetthe resulting string

Definition at line 87 of file bufr2tac_x13.c.

88{
89 if ( r < 0.0 || ( r > 0.0 && r < 0.1 ) )
90 {
91 strcpy ( target,"9999" );
92 }
93 else if ( r <= 999.8 )
94 {
95 sprintf ( target,"%04d", ( int ) ( r * 10.0 + 0.5 ) );
96 }
97 else
98 {
99 strcpy ( target,"9998" );
100 }
101 return target;
102}

Referenced by syn_parse_x13().

Here is the caller graph for this function:

◆ prec_to_RxRxRxRx()

char * prec_to_RxRxRxRx ( char *  target,
double  r 
)

converts a precipitation in Kg/m2 into a RxRxRxRx string

Parameters
rthe precipitation
targetthe resulting string

Definition at line 110 of file bufr2tac_x13.c.

111{
112 sprintf ( target,"%04d", ( int ) ( r * 10.0 + 0.5 ) );
113 return target;
114}

Referenced by climat_parse_x13().

Here is the caller graph for this function:

◆ recent_snow_to_ss()

char * recent_snow_to_ss ( char *  target,
double  r 
)

converts recent snow in m to ss (code table 3870)

Parameters
rrecent snow depth in meters
targetthe resulting string

Definition at line 157 of file bufr2tac_x13.c.

158{
159 int i;
160 i = ( int ) ( r * 1000.0 + 0.5 ); // convert to mm
161
162 if ( i == 0 )
163 {
164 sprintf ( target,"00" );
165 }
166 else if ( i < 0 )
167 {
168 sprintf ( target,"97" );
169 }
170 else if ( i < 7 )
171 {
172 sprintf ( target,"%02d", i + 90 );
173 }
174 else if ( i < 600 )
175 {
176 sprintf ( target,"%02d", i / 10 );
177 }
178 else if ( i <= 4000 )
179 {
180 sprintf ( target,"%02d", 50 + i/100 );
181 }
182 else if ( i > 4000 )
183 {
184 sprintf ( target,"98" );
185 }
186 else
187 {
188 sprintf ( target,"99" );
189 }
190 return target;
191}

Referenced by syn_parse_x13().

Here is the caller graph for this function:

◆ syn_parse_x13()

int syn_parse_x13 ( struct synop_chunks syn,
struct bufr2tac_subset_state s 
)

Parse a expanded descriptor with X = 13.

Parameters
synpointer to a struct synop_chunks where to set the results
spointer to a struct bufr2tac_subset_state where is stored needed information in sequential analysis

It returns 0 if success, 1 if problems when processing. If a descriptor is not processed returns 0 anyway

Definition at line 201 of file bufr2tac_x13.c.

202{
203 int tpd, hr;
204 char aux[8];
205
206 if ( s->a->mask & DESCRIPTOR_VALUE_MISSING )
207 {
208 return 0;
209 }
210
211 switch ( s->a->desc.y )
212 {
213 case 3: // 0 13 003 . Relative humidity %
214 if ( s->ival < 0 || s->ival > 100 )
215 {
216 return 0;
217 }
218 sprintf ( syn->s1.UUU, "%03d", s->ival );
219 syn->mask |= SYNOP_SEC1;
220 break;
221
222 case 11: // 0 13 011 . Total precipitation
223 if ( s->val < 0.0 )
224 {
225 if (s->val < -0.11 || s->val > -0.09)
226 return 0;
227 }
228 tpd = time_period_duration ( s );
229 hr = hour_rounded ( syn );
230 if ( tpd == 3600 )
231 {
232 if ( syn->s3.RRR[0] == 0 )
233 {
234 if ( strcmp ( "1", syn->s0.A1 ) == 0 ||
235 strcmp ( "2", syn->s0.A1 ) == 0 ||
236 strcmp ( "3", syn->s0.A1 ) == 0 ||
237 strcmp ( "4", syn->s0.A1 ) == 0 ||
238 strcmp ( "5", syn->s0.A1 ) == 0 ||
239 strcmp ( "6", syn->s0.A1 ) == 0 )
240 {
241 /*if ( hr % 3)
242 {*/
243 syn->s3.tr[0] = '5'; // 1 hour
244 prec_to_RRR ( syn->s3.RRR, s->val );
245 syn->mask |= SYNOP_SEC3;
246 /*}*/
247 }
248 }
249 else if ( syn->s5.RRR[0] == 0 )
250 {
251 syn->s5.tr[0] = '5'; // 1 hour
252 prec_to_RRR ( syn->s5.RRR, s->val );
253 syn->mask |= SYNOP_SEC5;
254 }
255 }
256 else if ( tpd == 7200 )
257 {
258 if ( syn->s1.RRR[0] == 0 )
259 {
260 if ( strcmp ( "6", syn->s0.A1 ) )
261 {
262 //Not for REG IV
263 syn->s1.tr[0] = '6'; // 2 hour
264 prec_to_RRR ( syn->s1.RRR, s->val );
265 syn->mask |= SYNOP_SEC1;
266 }
267 }
268 }
269 else if ( tpd == 10800 )
270 {
271 if ( ( hr % 3 ) == 0 )
272 {
273 if ( syn->s3.tr[0] == '5' )
274 {
275 syn->s5.tr[0] = '5';
276 strcpy ( syn->s5.RRR, syn->s3.RRR );
277 syn->mask |= SYNOP_SEC5;
278 }
279 syn->s3.tr[0] = '7'; // 3 hour
280 prec_to_RRR ( syn->s3.RRR, s->val );
281 syn->mask |= SYNOP_SEC3;
282 }
283 }
284 else if ( tpd == ( 6 * 3600 ) )
285 {
286 if ( strcmp ( "1", syn->s0.A1 ) == 0 )
287 {
288 if ( ( hr % 12 ) == 0 )
289 {
290 syn->s1.tr[0] = '1'; // 6 hour
291 prec_to_RRR ( syn->s1.RRR, s->val );
292 syn->mask |= SYNOP_SEC1;
293 }
294 }
295 else if ( strcmp ( "2", syn->s0.A1 ) == 0 )
296 {
297 if ( ( hr % 3 ) == 0 )
298 {
299 syn->s1.tr[0] = '1'; // 6 hour
300 prec_to_RRR ( syn->s1.RRR, s->val );
301 syn->mask |= SYNOP_SEC1;
302 }
303 }
304 else if ( strcmp ( "3", syn->s0.A1 ) == 0 )
305 {
306 if ( hr == 0 ||
307 hr == 6 ||
308 hr == 18 )
309 {
310 syn->s1.tr[0] = '1'; // 6 hour
311 prec_to_RRR ( syn->s1.RRR, s->val );
312 syn->mask |= SYNOP_SEC1;
313 }
314 }
315 else if ( strcmp ( "4", syn->s0.A1 ) == 0 )
316 {
317 if ( ( hr % 6 ) == 0 )
318 {
319 syn->s1.tr[0] = '1'; // 6 hour
320 prec_to_RRR ( syn->s1.RRR, s->val );
321 syn->mask |= SYNOP_SEC1;
322 }
323 }
324 else if ( strcmp ( "5", syn->s0.A1 ) == 0 )
325 {
326 if ( hr == 6 ||
327 hr == 12 ||
328 hr == 18 )
329 {
330 syn->s1.tr[0] = '1'; // 6 hour
331 prec_to_RRR ( syn->s1.RRR, s->val );
332 syn->mask |= SYNOP_SEC1;
333 }
334 }
335 else if ( strcmp ( "6", syn->s0.A1 ) == 0 )
336 {
337 if ( hr == 0 ||
338 hr == 18 )
339 {
340 syn->s1.tr[0] = '1'; // 6 hour
341 prec_to_RRR ( syn->s1.RRR, s->val );
342 syn->mask |= SYNOP_SEC1;
343 }
344 }
345 else if ( strcmp ( "7", syn->s0.A1 ) == 0 )
346 {
347 if ( hr == 6 )
348 {
349 syn->s1.tr[0] = '1'; // 6 hour
350 prec_to_RRR ( syn->s1.RRR, s->val );
351 syn->mask |= SYNOP_SEC1;
352 }
353 }
354
355 // last chance
356 if ( syn->s1.RRR[0] == 0 )
357 {
358 if ( ( hr % 6 ) == 0 )
359 {
360 syn->s1.tr[0] = '1'; // 6 hour
361 prec_to_RRR ( syn->s1.RRR, s->val );
362 syn->mask |= SYNOP_SEC1;
363 }
364 }
365 }
366 else if ( tpd == ( 9 * 3600 ) )
367 {
368 if ( syn->s3.RRR[0] == 0 )
369 {
370 syn->s3.tr[0] = '8'; // 9 hour
371 prec_to_RRR ( syn->s3.RRR, s->val );
372 syn->mask |= SYNOP_SEC3;
373 }
374 else if ( syn->s5.RRR[0] == 0 )
375 {
376 syn->s5.tr[0] = '8'; // 9 hour
377 prec_to_RRR ( syn->s5.RRR, s->val );
378 syn->mask |= SYNOP_SEC5;
379 }
380 }
381 else if ( tpd == ( 12 * 3600 ) )
382 {
383 if ( strcmp ( "1", syn->s0.A1 ) == 0 )
384 {
385 if ( hr == 18 )
386 {
387 syn->s1.tr[0] = '2'; // 12 hour
388 prec_to_RRR ( syn->s1.RRR, s->val );
389 syn->mask |= SYNOP_SEC1;
390 }
391 }
392 else if ( strcmp ( "2", syn->s0.A1 ) == 0 )
393 {
394 if ( ( hr % 3 ) == 0 )
395 {
396 syn->s1.tr[0] = '2'; // 12 hour
397 prec_to_RRR ( syn->s1.RRR, s->val );
398 syn->mask |= SYNOP_SEC1;
399 }
400 }
401 else if ( strcmp ( "6", syn->s0.A1 ) == 0 )
402 {
403 if ( ( hr % 12 ) == 6 )
404 {
405 syn->s1.tr[0] = '2'; // 12 hour
406 prec_to_RRR ( syn->s1.RRR, s->val ) ;
407 syn->mask |= SYNOP_SEC1;
408 }
409 else if ( strcmp( syn->s0.II, "08") == 0 && syn->s0.iii[0] == '5' ) // Portugal exception
410 {
411 syn->s1.tr[0] = '2'; // 12 hour
412 prec_to_RRR ( syn->s1.RRR, s->val );
413 syn->mask |= SYNOP_SEC1;
414 }
415 }
416 else if ( strcmp ( "7", syn->s0.A1 ) == 0 )
417 {
418 if ( hr == 12 )
419 {
420 syn->s1.tr[0] = '2'; // 12 hour
421 prec_to_RRR ( syn->s1.RRR, s->val );
422 syn->mask |= SYNOP_SEC1;
423 }
424 }
425
426 // last chance
427 if ( syn->s1.RRR[0] == 0 )
428 {
429 if ( ( hr % 6 ) == 0 )
430 {
431 syn->s1.tr[0] = '2'; // 12 hour
432 prec_to_RRR ( syn->s1.RRR, s->val );
433 syn->mask |= SYNOP_SEC1;
434 }
435 else if ( ( hr % 3 ) == 0 )
436 {
437 if ( syn->s3.RRR[0] == 0 )
438 {
439 syn->s3.tr[0] = '2'; // 12 hour
440 prec_to_RRR ( syn->s3.RRR, s->val );
441 syn->mask |= SYNOP_SEC3;
442 }
443 else if ( syn->s3.tr[0] == '1' ||
444 syn->s3.tr[0] == '5' )
445 {
446 strcpy ( syn->s5.tr, syn->s3.tr );
447 strcpy ( syn->s5.RRR, syn->s3.RRR );
448 syn->mask |= SYNOP_SEC5;
449 syn->s3.tr[0] = '2'; // 12 hour
450 prec_to_RRR ( syn->s3.RRR, s->val );
451 syn->mask |= SYNOP_SEC3;
452 }
453 }
454 }
455 }
456 else if ( tpd == ( 15 * 3600 ) )
457 {
458 if ( syn->s3.RRR[0] == 0 )
459 {
460 syn->s3.tr[0] = '9'; // 15 hour
461 prec_to_RRR ( syn->s3.RRR, s->val );
462 syn->mask |= SYNOP_SEC3;
463 }
464 else if ( syn->s5.RRR[0] == 0 )
465 {
466 syn->s5.tr[0] = '9'; // 15 hour
467 prec_to_RRR ( syn->s5.RRR, s->val );
468 syn->mask |= SYNOP_SEC5;
469 }
470 }
471 else if ( tpd == ( 18 * 3600 ) )
472 {
473 if ( strcmp ( "7", syn->s0.A1 ) == 0 )
474 {
475 if ( hr == 18 )
476 {
477 syn->s1.tr[0] = '3'; // 12 hour
478 prec_to_RRR ( syn->s1.RRR, s->val );
479 syn->mask |= SYNOP_SEC1;
480 }
481 }
482 }
483 else if ( tpd == ( 24 * 3600 ) )
484 {
485 if ( strcmp ( "1", syn->s0.A1 ) == 0 )
486 {
487 if ( hr == 6 )
488 {
489 syn->s1.tr[0] = '4'; // 24 hour
490 prec_to_RRR ( syn->s1.RRR, s->val );
491 syn->mask |= SYNOP_SEC1;
492 }
493 prec_to_RRRR24 ( syn->s3.RRRR24, s->val );
494 syn->mask |= SYNOP_SEC3;
495 }
496 else if ( strcmp ( "2", syn->s0.A1 ) == 0 )
497 {
498 prec_to_RRRR24 ( syn->s3.RRRR24, s->val );
499 syn->mask |= SYNOP_SEC3;
500 }
501 else if ( strcmp ( "3", syn->s0.A1 ) == 0 )
502 {
503 if ( hr == 12 )
504 {
505 syn->s1.tr[0] = '4'; // 24 hour
506 prec_to_RRR ( syn->s1.RRR, s->val );
507 syn->mask |= SYNOP_SEC1;
508 }
509 prec_to_RRRR24 ( syn->s3.RRRR24, s->val );
510 syn->mask |= SYNOP_SEC3;
511 }
512 else if ( strcmp ( "4", syn->s0.A1 ) == 0 )
513 {
514 prec_to_RRRR24 ( syn->s3.RRRR24, s->val );
515 syn->mask |= SYNOP_SEC3;
516 }
517 else if ( strcmp ( "5", syn->s0.A1 ) == 0 )
518 {
519 if ( hr == 0 )
520 {
521 syn->s1.tr[0] = '4'; // 24 hour
522 prec_to_RRR ( syn->s1.RRR, s->val );
523 syn->mask |= SYNOP_SEC1;
524 }
525 prec_to_RRRR24 ( syn->s3.RRRR24, s->val );
526 syn->mask |= SYNOP_SEC3;
527 }
528 else if ( strcmp ( "6", syn->s0.A1 ) == 0 )
529 {
530 if ( strcmp ( "07", syn->s0.II ) == 0 ) // France
531 {
532 if ( strcmp ( "06", syn->e.HH ) == 0 )
533 {
534 prec_to_RRRR24 ( syn->s3.RRRR24, s->val );
535 syn->mask |= SYNOP_SEC3;
536 }
537 }
538 else
539 {
540 prec_to_RRRR24 ( syn->s3.RRRR24, s->val );
541 syn->mask |= SYNOP_SEC3;
542 }
543 }
544 else if ( strcmp ( "7", syn->s0.A1 ) == 0 )
545 {
546 if ( hr == 0 )
547 {
548 syn->s1.tr[0] = '4'; // 24 hour
549 prec_to_RRR ( syn->s1.RRR, s->val );
550 syn->mask |= SYNOP_SEC1;
551 }
552 }
553 }
554 break;
555
556 case 13: // 0 13 013 . Total snow depth
557 if ( syn->s3.sss[0] == 0 )
558 {
559 total_snow_depth_to_sss ( syn->s3.sss, s->val );
560 syn->mask |= SYNOP_SEC3;
561 }
562 break;
563
564 case 19: // 0 13 019 . Total precipitaction past 1 hour
565 hr = hour_rounded ( syn );
566 if ( syn->s3.RRR[0] == 0 )
567 {
568 if ( strcmp ( "1", syn->s0.A1 ) == 0 ||
569 strcmp ( "2", syn->s0.A1 ) == 0 ||
570 strcmp ( "3", syn->s0.A1 ) == 0 ||
571 strcmp ( "4", syn->s0.A1 ) == 0 ||
572 strcmp ( "5", syn->s0.A1 ) == 0 ||
573 strcmp ( "6", syn->s0.A1 ) == 0 )
574 {
575 /*if ( hr % 3)
576 {*/
577 syn->s3.tr[0] = '5'; // 1 hour
578 prec_to_RRR ( syn->s3.RRR, s->val );
579 syn->mask |= SYNOP_SEC3;
580 /*}*/
581 }
582 }
583 else if ( syn->s5.RRR[0] == 0 )
584 {
585 syn->s5.tr[0] = '5'; // 1 hour
586 prec_to_RRR ( syn->s5.RRR, s->val );
587 syn->mask |= SYNOP_SEC5;
588 }
589 break;
590
591 case 20: // 0 13 020 . Total precipitation past 3 hours
592 hr = hour_rounded ( syn );
593 if ( ( hr % 3 ) == 0 )
594 {
595 if ( syn->s3.tr[0] == '5' )
596 {
597 syn->s5.tr[0] = '5';
598 strcpy ( syn->s5.RRR, syn->s3.RRR );
599 syn->mask |= SYNOP_SEC5;
600 }
601 syn->s3.tr[0] = '7'; // 3 hour
602 prec_to_RRR ( syn->s3.RRR, s->val );
603 syn->mask |= SYNOP_SEC3;
604 }
605 break;
606
607 case 21: // 0 13 021 . Total precipitation past 6 hours
608 hr = hour_rounded ( syn );
609 if ( strcmp ( "1", syn->s0.A1 ) == 0 )
610 {
611 if ( ( hr % 12 ) == 0 )
612 {
613 syn->s1.tr[0] = '1'; // 6 hour
614 prec_to_RRR ( syn->s1.RRR, s->val );
615 syn->mask |= SYNOP_SEC1;
616 }
617 }
618 else if ( strcmp ( "2", syn->s0.A1 ) == 0 )
619 {
620 if ( ( hr % 3 ) == 0 )
621 {
622 syn->s1.tr[0] = '1'; // 6 hour
623 prec_to_RRR ( syn->s1.RRR, s->val );
624 syn->mask |= SYNOP_SEC1;
625 }
626 }
627 else if ( strcmp ( "3", syn->s0.A1 ) == 0 )
628 {
629 if ( hr == 0 ||
630 hr == 6 ||
631 hr == 18 )
632 {
633 syn->s1.tr[0] = '1'; // 6 hour
634 prec_to_RRR ( syn->s1.RRR, s->val );
635 syn->mask |= SYNOP_SEC1;
636 }
637 }
638 else if ( strcmp ( "4", syn->s0.A1 ) == 0 )
639 {
640 if ( ( hr % 6 ) == 0 )
641 {
642 syn->s1.tr[0] = '1'; // 6 hour
643 prec_to_RRR ( syn->s1.RRR, s->val );
644 syn->mask |= SYNOP_SEC1;
645 }
646 }
647 else if ( strcmp ( "5", syn->s0.A1 ) == 0 )
648 {
649 if ( hr == 6 ||
650 hr == 12 ||
651 hr == 18 )
652 {
653 syn->s1.tr[0] = '1'; // 6 hour
654 prec_to_RRR ( syn->s1.RRR, s->val );
655 syn->mask |= SYNOP_SEC1;
656 }
657 }
658 else if ( strcmp ( "6", syn->s0.A1 ) == 0 )
659 {
660 if ( hr == 0 ||
661 hr == 18 )
662 {
663 syn->s1.tr[0] = '1'; // 6 hour
664 prec_to_RRR ( syn->s1.RRR, s->val );
665 syn->mask |= SYNOP_SEC1;
666 }
667 }
668 else if ( strcmp ( "7", syn->s0.A1 ) == 0 )
669 {
670 if ( hr == 6 )
671 {
672 syn->s1.tr[0] = '1'; // 6 hour
673 prec_to_RRR ( syn->s1.RRR, s->val );
674 syn->mask |= SYNOP_SEC1;
675 }
676 }
677
678 if ( syn->s1.RRR[0] == 0 )
679 {
680 if ( ( hr % 6 ) == 0 )
681 {
682 syn->s1.tr[0] = '1'; // 6 hour
683 prec_to_RRR ( syn->s1.RRR, s->val );
684 syn->mask |= SYNOP_SEC1;
685 }
686 }
687 break;
688
689 case 22: // 0 13 022 . Total precipitation past 12 hours
690 hr = hour_rounded ( syn );
691 if ( strcmp ( "1", syn->s0.A1 ) == 0 )
692 {
693 if ( hr == 18 )
694 {
695 syn->s1.tr[0] = '2'; // 12 hour
696 prec_to_RRR ( syn->s1.RRR, s->val );
697 syn->mask |= SYNOP_SEC1;
698 }
699 }
700 else if ( strcmp ( "2", syn->s0.A1 ) == 0 )
701 {
702 if ( ( hr % 3 ) == 0 )
703 {
704 syn->s1.tr[0] = '2'; // 12 hour
705 prec_to_RRR ( syn->s1.RRR, s->val );
706 syn->mask |= SYNOP_SEC1;
707 }
708 }
709 else if ( strcmp ( "6", syn->s0.A1 ) == 0 )
710 {
711 if ( ( hr % 12 ) == 6 )
712 {
713 syn->s1.tr[0] = '2'; // 12 hour
714 prec_to_RRR ( syn->s1.RRR, s->val );
715 syn->mask |= SYNOP_SEC1;
716 }
717 }
718 else if ( strcmp ( "7", syn->s0.A1 ) == 0 )
719 {
720 if ( hr == 12 )
721 {
722 syn->s1.tr[0] = '2'; // 12 hour
723 prec_to_RRR ( syn->s1.RRR, s->val );
724 syn->mask |= SYNOP_SEC1;
725 }
726 }
727
728 // Last chance
729 if ( syn->s1.RRR[0] == 0 )
730 {
731 if ( ( hr % 6 ) == 0 )
732 {
733 syn->s1.tr[0] = '2'; // 12 hour
734 prec_to_RRR ( syn->s1.RRR, s->val );
735 syn->mask |= SYNOP_SEC1;
736 }
737 else if ( ( hr % 3 ) == 0 )
738 {
739 if ( syn->s3.RRR[0] == 0 )
740 {
741 syn->s3.tr[0] = '2'; // 12 hour
742 prec_to_RRR ( syn->s3.RRR, s->val );
743 syn->mask |= SYNOP_SEC3;
744 }
745 else if ( syn->s3.tr[0] == '1' ||
746 syn->s3.tr[0] == '5' )
747 {
748 strcpy ( syn->s5.tr, syn->s3.tr );
749 strcpy ( syn->s5.RRR, syn->s3.RRR );
750 syn->mask |= SYNOP_SEC5;
751 syn->s3.tr[0] = '2'; // 12 hour
752 prec_to_RRR ( syn->s3.RRR, s->val );
753 syn->mask |= SYNOP_SEC3;
754 }
755 }
756 }
757
758 break;
759
760 case 23: // 0 13 023 . Total precipitaction past 24 hours
761 if ( s->val < 0.0 )
762 {
763 return 0;
764 }
765 hr = hour_rounded ( syn );
766 if ( strcmp ( "1", syn->s0.A1 ) == 0 )
767 {
768 if ( hr == 6 )
769 {
770 syn->s1.tr[0] = '4'; // 24 hour
771 prec_to_RRR ( syn->s1.RRR, s->val );
772 syn->mask |= SYNOP_SEC1;
773 }
774 prec_to_RRRR24 ( syn->s3.RRRR24, s->val );
775 syn->mask |= SYNOP_SEC3;
776 }
777 else if ( strcmp ( "2", syn->s0.A1 ) == 0 )
778 {
779 prec_to_RRRR24 ( syn->s3.RRRR24, s->val );
780 syn->mask |= SYNOP_SEC3;
781 }
782 else if ( strcmp ( "3", syn->s0.A1 ) == 0 )
783 {
784 if ( hr == 12 )
785 {
786 syn->s1.tr[0] = '4'; // 24 hour
787 prec_to_RRR ( syn->s1.RRR, s->val );
788 syn->mask |= SYNOP_SEC1;
789 }
790 prec_to_RRRR24 ( syn->s3.RRRR24, s->val );
791 syn->mask |= SYNOP_SEC3;
792 }
793 else if ( strcmp ( "4", syn->s0.A1 ) == 0 )
794 {
795 prec_to_RRRR24 ( syn->s3.RRRR24, s->val );
796 syn->mask |= SYNOP_SEC3;
797 }
798 else if ( strcmp ( "5", syn->s0.A1 ) == 0 )
799 {
800 if ( hr == 0 )
801 {
802 syn->s1.tr[0] = '4'; // 24 hour
803 prec_to_RRR ( syn->s1.RRR, s->val );
804 syn->mask |= SYNOP_SEC1;
805 }
806 prec_to_RRRR24 ( syn->s3.RRRR24, s->val );
807 syn->mask |= SYNOP_SEC3;
808 }
809 else if ( strcmp ( "6", syn->s0.A1 ) == 0 )
810 {
811 if ( strcmp ( "07", syn->s0.II ) == 0 ) // France
812 {
813 if ( strcmp ( "06", syn->e.HH ) == 0 )
814 {
815 prec_to_RRRR24 ( syn->s3.RRRR24, s->val );
816 syn->mask |= SYNOP_SEC3;
817 }
818 }
819 else
820 {
821 prec_to_RRRR24 ( syn->s3.RRRR24, s->val );
822 syn->mask |= SYNOP_SEC3;
823 }
824 }
825 else if ( strcmp ( "7", syn->s0.A1 ) == 0 )
826 {
827 if ( hr == 0 )
828 {
829 syn->s1.tr[0] = '4'; // 24 hour
830 prec_to_RRR ( syn->s1.RRR, s->val );
831 syn->mask |= SYNOP_SEC1;
832 }
833 }
834 break;
835
836 case 56: // 0 13 056 . Character and intensity of precipitation
837 if ( strcmp ( syn->s0.A1, "1" ) == 0 ) // Only for Region I
838 {
839 sprintf ( aux, "%d", s->ival );
840 syn->s3.XoXoXoXo[2] = aux[0];
841 syn->mask |= SYNOP_SEC3;
842 }
843 break;
844
845 case 57: // 0 13 057 . Time of beginning or end of precipitation
846 if ( strcmp ( syn->s0.A1, "1" ) == 0 ) // Only for region I
847 {
848 sprintf ( aux, "%d" , s->ival );
849 syn->s3.XoXoXoXo[3] = aux[0];
850 syn->mask |= SYNOP_SEC3;
851 }
852 break;
853
854 case 118: // 0 13 118 . Recent snow depth
855 if ( syn->s3.d9.n < SYNOP_NMISC )
856 {
857 sprintf ( syn->s3.d9.misc[syn->s3.d9.n].SpSp, "931%s", recent_snow_to_ss ( aux, s->val ) );
858 ( syn->s3.d9.n ) ++;
859 }
860 break;
861 default:
862 if ( BUFR2TAC_DEBUG_LEVEL > 1 && (s->a->mask & DESCRIPTOR_VALUE_MISSING) == 0 )
863 bufr2tac_set_error ( s, 0, "syn_parse_x13()", "Descriptor not parsed" );
864 break;
865 }
866 return 0;
867}
int time_period_duration(struct bufr2tac_subset_state *s)
Get time period duration in seconds.
Definition: bufr2tac_x04.c:33
int hour_rounded(struct synop_chunks *syn)
Get the rounded hour of a given date.
Definition: bufr2tac_x04.c:78
char * prec_to_RRRR24(char *target, double r)
converts a precipitation in Kg/m2 into a RRRR24 string
Definition: bufr2tac_x13.c:87
char * recent_snow_to_ss(char *target, double r)
converts recent snow in m to ss (code table 3870)
Definition: bufr2tac_x13.c:157
char * prec_to_RRR(char *target, double r)
converts a precipitation in Kg/m2 into a RRR string
Definition: bufr2tac_x13.c:32
char * total_snow_depth_to_sss(char *target, double r)
converts tatal snow depth in m to sss (code table 3889)
Definition: bufr2tac_x13.c:124
#define SYNOP_NMISC
number of misc3 struct to store the parsed results of 9SpSpspsp groups
Definition: metsynop.h:84
#define SYNOP_SEC1
mask bit meaning section 1 or synop is solicited to or parsed with success
Definition: metsynop.h:39
#define SYNOP_SEC3
mask bit meaning section 3 or synop is solicited to or parsed with success
Definition: metsynop.h:49
#define SYNOP_SEC5
mask bit meaning section 5 or synop is solicited to or parsed with success
Definition: metsynop.h:59
struct misc3 misc[SYNOP_NMISC]
Definition: metsynop.h:210
size_t n
Definition: metsynop.h:209
char SpSp[4]
Definition: metsynop.h:203
char HH[4]
Definition: metcommon.h:36
struct synop_sec1 s1
Definition: metsynop.h:298
struct synop_sec3 s3
Definition: metsynop.h:300
struct synop_sec5 s5
Definition: metsynop.h:302
struct report_date_ext e
Definition: metsynop.h:295
struct synop_sec0 s0
Definition: metsynop.h:297
char iii[4]
Definition: metsynop.h:102
char II[4]
Definition: metsynop.h:101
char A1[2]
Definition: metsynop.h:94
char UUU[4]
Definition: metsynop.h:135
char tr[2]
Definition: metsynop.h:143
char RRR[4]
Definition: metsynop.h:142
char RRRR24[6]
Definition: metsynop.h:257
char XoXoXoXo[6]
Definition: metsynop.h:222
char tr[2]
Definition: metsynop.h:256
char RRR[4]
Definition: metsynop.h:255
char sss[4]
Definition: metsynop.h:230
struct data9 d9
Definition: metsynop.h:260
char RRR[4]
Definition: metsynop.h:284
char tr[2]
Definition: metsynop.h:285

References bufr2tac_subset_state::a, synop_sec0::A1, BUFR2TAC_DEBUG_LEVEL, bufr2tac_set_error(), synop_sec3::d9, bufr_atom_data::desc, DESCRIPTOR_VALUE_MISSING, synop_chunks::e, report_date_ext::HH, hour_rounded(), synop_sec0::II, synop_sec0::iii, bufr2tac_subset_state::ival, bufr_atom_data::mask, synop_chunks::mask, data9::misc, data9::n, prec_to_RRR(), prec_to_RRRR24(), recent_snow_to_ss(), synop_sec1::RRR, synop_sec3::RRR, synop_sec5::RRR, synop_sec3::RRRR24, synop_chunks::s0, synop_chunks::s1, synop_chunks::s3, synop_chunks::s5, misc3::SpSp, synop_sec3::sss, SYNOP_NMISC, SYNOP_SEC1, SYNOP_SEC3, SYNOP_SEC5, time_period_duration(), total_snow_depth_to_sss(), synop_sec1::tr, synop_sec3::tr, synop_sec5::tr, synop_sec1::UUU, bufr2tac_subset_state::val, synop_sec3::XoXoXoXo, and bufr_descriptor::y.

Referenced by parse_subset_as_synop().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ total_snow_depth_to_sss()

char * total_snow_depth_to_sss ( char *  target,
double  r 
)

converts tatal snow depth in m to sss (code table 3889)

Parameters
rrecent snow depth in meters
targetthe resulting string

Definition at line 124 of file bufr2tac_x13.c.

125{
126 int i;
127 if ( r >= 0.0 )
128 i = ( int ) ( r * 100.0 + 0.5 ); // convert to cm
129 else
130 i = ( int ) ( r * 100.0 - 0.5 ); // convert to cm
131
132 if ( i > 0 && i <= 996 )
133 {
134 sprintf ( target, "%03d", i );
135 }
136 else if ( i == -1 )
137 {
138 sprintf ( target, "997" );
139 }
140 else if ( i == -2 )
141 {
142 sprintf ( target, "998" );
143 }
144 else
145 {
146 sprintf ( target, "999" );
147 }
148 return target;
149}

Referenced by syn_parse_x13().

Here is the caller graph for this function: