bufr2synop 0.24.0
Functions
bufr2tac_x12.c File Reference

decodes the descriptors with X = 12 (Temperature) More...

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

Go to the source code of this file.

Functions

char * kelvin_to_snTTT (char *target, double T)
 converts a kelvin temperature value into a snTTT string More...
 
char * kelvin_to_snTT (char *target, double T)
 converts a kelvin temperature value into a snTT string More...
 
char * kelvin_to_TT (char *target, double T)
 converts a kelvin temperature value into a TT string More...
 
char * kelvin_to_TTTT (char *target, double T)
 converts a kelvin temperature value into a TTTT string More...
 
char * kelvin_to_TTTa (char *target, double T)
 Set temperature TTTa. More...
 
char * dewpoint_depression_to_DnDn (char *target, double T, double Td)
 Set DnDn (dewpoint depression) More...
 
int syn_parse_x12 (struct synop_chunks *syn, struct bufr2tac_subset_state *s)
 Parse a expanded descriptor with X = 12. More...
 
int buoy_parse_x12 (struct buoy_chunks *b, struct bufr2tac_subset_state *s)
 Parse a expanded descriptor with X = 12. More...
 
int climat_parse_x12 (struct climat_chunks *c, struct bufr2tac_subset_state *s)
 Parse a expanded descriptor with X = 12. More...
 
int temp_parse_x12 (struct temp_chunks *t, struct bufr2tac_subset_state *s)
 Parse a expanded descriptor with X = 12. More...
 

Detailed Description

decodes the descriptors with X = 12 (Temperature)

Definition in file bufr2tac_x12.c.

Function Documentation

◆ buoy_parse_x12()

int buoy_parse_x12 ( struct buoy_chunks b,
struct bufr2tac_subset_state s 
)

Parse a expanded descriptor with X = 12.

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 466 of file bufr2tac_x12.c.

467{
468 char aux[16];
469
470 if ( s->a->mask & DESCRIPTOR_VALUE_MISSING )
471 {
472 return 0;
473 }
474
475 switch ( s->a->desc.y )
476 {
477 case 1: // 0 12 001 . Air temperature
478 case 4: // 0 12 004 . Air temperatura at 2 m
479 case 101: // 0 12 101 . Air temperature
480 case 104: // 0 12 104 . Air temperature at 2 m
481 if ( b->s1.TTT[0] == 0 )
482 {
483 if ( kelvin_to_snTTT ( aux, s->val ) )
484 {
485 b->s1.sn1[0] = aux[0];
486 strcpy ( b->s1.TTT, aux + 1 );
487 b->mask |= BUOY_SEC1;
488 }
489 else if ( BUFR2TAC_DEBUG_LEVEL > 0 )
490 bufr2tac_set_error ( s, 1, "buoy_parse_x12()->kelvin_to_snTTT()", "Unspected parse problem" );
491 }
492 break;
493 case 3: // 0 12 003 . Dewpoint temperature
494 case 6: // 0 12 006 . Dewpoint temperature at 2 m
495 case 103: // 0 12 103 . Dewpoint temperature
496 case 106: // 0 12 106 . Dewpoint temperature at 2 m
497 if ( b->s1.TdTdTd[0] == 0 )
498 {
499 if ( kelvin_to_snTTT ( aux, s->val ) )
500 {
501 b->s1.sn2[0] = aux[0];
502 strcpy ( b->s1.TdTdTd, aux + 1 );
503 b->mask |= BUOY_SEC1;
504 }
505 else if ( BUFR2TAC_DEBUG_LEVEL > 0 )
506 bufr2tac_set_error ( s, 1, "buoy_parse_x12()->kelvin_to_snTTT()", "Unspected parse problem" );
507 }
508 break;
509
510 default:
511 if ( BUFR2TAC_DEBUG_LEVEL > 1 && (s->a->mask & DESCRIPTOR_VALUE_MISSING) == 0 )
512 bufr2tac_set_error ( s, 0, "buoy_parse_x12()", "Descriptor not parsed" );
513 break;
514 }
515 return 0;
516}
int BUFR2TAC_DEBUG_LEVEL
Definition: bufr2tac.c:31
int bufr2tac_set_error(struct bufr2tac_subset_state *s, int severity, char *origin, char *explanation)
char * kelvin_to_snTTT(char *target, double T)
converts a kelvin temperature value into a snTTT string
Definition: bufr2tac_x12.c:32
#define DESCRIPTOR_VALUE_MISSING
Bit mask for a missing value in a struct bufr_atom_data.
Definition: bufrdeco.h:140
#define BUOY_SEC1
mask bit meaning section 1 of buoy is solicited to or parsed with success
Definition: metbuoy.h:38
struct bufr_atom_data * a
Definition: bufr2tac.h:249
uint32_t mask
Definition: bufrdeco.h:437
struct bufr_descriptor desc
Definition: bufrdeco.h:436
int mask
Definition: metbuoy.h:198
struct buoy_sec1 s1
Definition: metbuoy.h:202
char sn2[2]
Definition: metbuoy.h:98
char TTT[4]
Definition: metbuoy.h:97
char TdTdTd[4]
Definition: metbuoy.h:99
char sn1[2]
Definition: metbuoy.h:96

References bufr2tac_subset_state::a, BUFR2TAC_DEBUG_LEVEL, bufr2tac_set_error(), BUOY_SEC1, bufr_atom_data::desc, DESCRIPTOR_VALUE_MISSING, kelvin_to_snTTT(), bufr_atom_data::mask, buoy_chunks::mask, buoy_chunks::s1, buoy_sec1::sn1, buoy_sec1::sn2, buoy_sec1::TdTdTd, buoy_sec1::TTT, bufr2tac_subset_state::val, 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_x12()

int climat_parse_x12 ( struct climat_chunks c,
struct bufr2tac_subset_state s 
)

Parse a expanded descriptor with X = 12.

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 526 of file bufr2tac_x12.c.

527{
528 char aux[16];
529
530 if ( s->a->mask & DESCRIPTOR_VALUE_MISSING )
531 {
532 return 0;
533 }
534
535 if ( c == NULL )
536 {
537 return 1;
538 }
539
540 switch ( s->a->desc.y )
541 {
542 case 101:
543 if ( s->is_normal == 0 )
544 {
545 if ( s->isq_val == 4 ) // mean value
546 {
547 if ( kelvin_to_snTTT ( aux, s->val ) )
548 {
549 c->s1.s[0] = aux[0];
550 strcpy ( c->s1.TTT, aux + 1 );
551 c->mask |= CLIMAT_SEC1;
552 }
553 else if ( BUFR2TAC_DEBUG_LEVEL > 0 )
554 bufr2tac_set_error ( s, 1, "climat_parse_x12()->kelvin_to_snTTT()", "Unspected parse problem" );
555 }
556 else if ( s->isq_val == 2 ) // maximum value
557 {
558 if ( kelvin_to_snTTT ( aux, s->val ) )
559 {
560 c->s4.sax[0] = aux[0];
561 strcpy ( c->s4.Tax, aux + 1 );
562 if ( s->more_days == 0 )
563 {
564 sprintf ( c->s4.yax, "%02d", s->day );
565 }
566 else
567 {
568 sprintf ( c->s4.yax, "%02d", ( s->day + 50 ) % 100 );
569 }
570 c->mask |= CLIMAT_SEC4;
571 }
572 else if ( BUFR2TAC_DEBUG_LEVEL > 0 )
573 bufr2tac_set_error ( s, 1, "climat_parse_x12()->kelvin_to_snTTT()", "Unspected parse problem" );
574
575 }
576 else if ( s->isq_val == 3 ) // minimum value
577 {
578 if ( kelvin_to_snTTT ( aux, s->val ) )
579 {
580 c->s4.san[0] = aux[0];
581 strcpy ( c->s4.Tan, aux + 1 );
582 if ( s->more_days == 0 )
583 {
584 sprintf ( c->s4.yan, "%02d", s->day );
585 }
586 else
587 {
588 sprintf ( c->s4.yan, "%02d", ( s->day + 50 ) % 100 );
589 }
590 c->mask |= CLIMAT_SEC4;
591 }
592 else if ( BUFR2TAC_DEBUG_LEVEL > 0 )
593 bufr2tac_set_error ( s, 1, "climat_parse_x12()->kelvin_to_snTTT()", "Unspected parse problem" );
594 }
595 }
596 else
597 {
598 if ( c->s2.TTT[0] == 0 )
599 {
600 if ( kelvin_to_snTTT ( aux, s->val ) )
601 {
602 c->s2.s[0] = aux[0];
603 strcpy ( c->s2.TTT, aux + 1 );
604 c->mask |= CLIMAT_SEC2;
605 }
606 else if ( BUFR2TAC_DEBUG_LEVEL > 0 )
607 bufr2tac_set_error ( s, 1, "climat_parse_x12()->kelvin_to_snTTT()", "Unspected parse problem" );
608 }
609
610 }
611 break;
612
613 case 118: // 0 12 118 . Maximum temperature at heigh specified, past 24 h
614 if ( s->is_normal == 0 )
615 {
616 if ( c->s1.TxTxTx[0] == 0 )
617 {
618 if ( kelvin_to_snTTT ( aux, s->val ) )
619 {
620 c->s1.sx[0] = aux[0];
621 strcpy ( c->s1.TxTxTx, aux + 1 );
622 c->mask |= CLIMAT_SEC1;
623 }
624 else if ( BUFR2TAC_DEBUG_LEVEL > 0 )
625 bufr2tac_set_error ( s, 1, "climat_parse_x12()->kelvin_to_snTTT()", "Unspected parse problem" );
626 }
627 }
628 else
629 {
630 if ( c->s2.TxTxTx[0] == 0 )
631 {
632 if ( kelvin_to_snTTT ( aux, s->val ) )
633 {
634 c->s2.sx[0] = aux[0];
635 strcpy ( c->s2.TxTxTx, aux + 1 );
636 c->mask |= CLIMAT_SEC2;
637 }
638 else if ( BUFR2TAC_DEBUG_LEVEL > 0 )
639 bufr2tac_set_error ( s, 1, "climat_parse_x12()->kelvin_to_snTTT()", "Unspected parse problem" );
640 }
641 }
642 break;
643
644 case 119: // 0 12 119 . Minimum temperature at heigh specified, past 24 h
645 if ( s->is_normal == 0 )
646 {
647 if ( c->s1.TnTnTn[0] == 0 )
648 {
649 if ( kelvin_to_snTTT ( aux, s->val ) )
650 {
651 c->s1.sn[0] = aux[0];
652 strcpy ( c->s1.TnTnTn, aux + 1 );
653 c->mask |= CLIMAT_SEC1;
654 }
655 else if ( BUFR2TAC_DEBUG_LEVEL > 0 )
656 bufr2tac_set_error ( s, 1, "climat_parse_x12()->kelvin_to_snTTT()", "Unspected parse problem" );
657 }
658 }
659 else
660 {
661 if ( c->s2.TnTnTn[0] == 0 )
662 {
663 if ( kelvin_to_snTTT ( aux, s->val ) )
664 {
665 c->s2.sn[0] = aux[0];
666 strcpy ( c->s2.TnTnTn, aux + 1 );
667 c->mask |= CLIMAT_SEC2;
668 }
669 else if ( BUFR2TAC_DEBUG_LEVEL > 0 )
670 bufr2tac_set_error ( s, 1, "climat_parse_x12()->kelvin_to_snTTT()", "Unspected parse problem" );
671 }
672 }
673 break;
674
675 case 151: // 0 12 151 . Standard deviation of daily mean temperature
676 sprintf ( aux, "%03d", ( int ) ( s->val * 10.0 + 0.5 ) );
677 if ( s->is_normal == 0 )
678 {
679 strcpy ( c->s1.ststst, aux );
680 c->mask |= CLIMAT_SEC1;
681 }
682 else
683 {
684 strcpy ( c->s2.ststst, aux );
685 c->mask |= CLIMAT_SEC2;
686 }
687 break;
688
689 case 152: // 0 12 152 . Highest daily mean temperature
690 if ( s->a1->desc.x == 4 && s->a1->desc.y == 3 )
691 {
692 if ( kelvin_to_snTTT ( aux, s->val ) )
693 {
694 c->s4.sx[0] = aux[0];
695 strcpy ( c->s4.Txd, aux + 1 );
696 }
697 else if ( BUFR2TAC_DEBUG_LEVEL > 0 )
698 bufr2tac_set_error ( s, 1, "climat_parse_x12()->kelvin_to_snTTT()", "Unspected parse problem" );
699
700 if ( s->isq_val == 0 )
701 {
702 sprintf ( c->s4.yx, "%02d", s->day );
703 }
704 else
705 {
706 sprintf ( c->s4.yx, "%02d", ( s->day + 50 ) % 100 );
707 }
708 c->mask |= CLIMAT_SEC4;
709 }
710 break;
711
712 case 153: // 0 12 153 . Lowest daily mean temperature
713 if ( s->a1->desc.x == 4 && s->a1->desc.y == 3 )
714 {
715 if ( kelvin_to_snTTT ( aux, s->val ) )
716 {
717 c->s4.sn[0] = aux[0];
718 strcpy ( c->s4.Tnd, aux + 1 );
719 }
720 else if ( BUFR2TAC_DEBUG_LEVEL > 0 )
721 bufr2tac_set_error ( s, 1, "climat_parse_x12()->kelvin_to_snTTT()", "Unspected parse problem" );
722
723 if ( s->isq_val == 0 )
724 {
725 sprintf ( c->s4.yn, "%02d", s->day );
726 }
727 else
728 {
729 sprintf ( c->s4.yn, "%02d", ( s->day + 50 ) % 100 );
730 }
731 c->mask |= CLIMAT_SEC4;
732 }
733 break;
734
735 default:
736 if ( BUFR2TAC_DEBUG_LEVEL > 1 && (s->a->mask & DESCRIPTOR_VALUE_MISSING) == 0 )
737 bufr2tac_set_error ( s, 0, "climat_parse_x12()", "Descriptor not parsed" );
738 break;
739 }
740 return 0;
741}
#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 bufr_atom_data * a1
Definition: bufr2tac.h:250
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 s[2]
Definition: metclimat.h:84
char sx[2]
Definition: metclimat.h:87
char TxTxTx[4]
Definition: metclimat.h:88
char TTT[4]
Definition: metclimat.h:85
char sn[2]
Definition: metclimat.h:89
char ststst[4]
Definition: metclimat.h:86
char TnTnTn[4]
Definition: metclimat.h:90
char TTT[4]
Definition: metclimat.h:116
char TnTnTn[4]
Definition: metclimat.h:121
char TxTxTx[4]
Definition: metclimat.h:119
char ststst[4]
Definition: metclimat.h:117
char sn[2]
Definition: metclimat.h:120
char sx[2]
Definition: metclimat.h:118
char s[2]
Definition: metclimat.h:115
char sax[2]
Definition: metclimat.h:174
char sx[2]
Definition: metclimat.h:168
char Tnd[4]
Definition: metclimat.h:172
char yx[4]
Definition: metclimat.h:170
char san[2]
Definition: metclimat.h:177
char yn[4]
Definition: metclimat.h:173
char Tax[4]
Definition: metclimat.h:175
char yax[4]
Definition: metclimat.h:176
char Tan[4]
Definition: metclimat.h:178
char yan[4]
Definition: metclimat.h:179
char Txd[4]
Definition: metclimat.h:169
char sn[2]
Definition: metclimat.h:171

References bufr2tac_subset_state::a, bufr2tac_subset_state::a1, BUFR2TAC_DEBUG_LEVEL, bufr2tac_set_error(), CLIMAT_SEC1, CLIMAT_SEC2, CLIMAT_SEC4, bufr2tac_subset_state::day, bufr_atom_data::desc, DESCRIPTOR_VALUE_MISSING, bufr2tac_subset_state::is_normal, bufr2tac_subset_state::isq_val, kelvin_to_snTTT(), bufr_atom_data::mask, climat_chunks::mask, bufr2tac_subset_state::more_days, climat_sec1::s, climat_sec2::s, climat_chunks::s1, climat_chunks::s2, climat_chunks::s4, climat_sec4::san, climat_sec4::sax, climat_sec1::sn, climat_sec2::sn, climat_sec4::sn, climat_sec1::ststst, climat_sec2::ststst, climat_sec1::sx, climat_sec2::sx, climat_sec4::sx, climat_sec4::Tan, climat_sec4::Tax, climat_sec4::Tnd, climat_sec1::TnTnTn, climat_sec2::TnTnTn, climat_sec1::TTT, climat_sec2::TTT, climat_sec4::Txd, climat_sec1::TxTxTx, climat_sec2::TxTxTx, bufr2tac_subset_state::val, bufr_descriptor::x, bufr_descriptor::y, climat_sec4::yan, climat_sec4::yax, climat_sec4::yn, and climat_sec4::yx.

Referenced by parse_subset_as_climat().

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

◆ dewpoint_depression_to_DnDn()

char * dewpoint_depression_to_DnDn ( char *  target,
double  T,
double  Td 
)

Set DnDn (dewpoint depression)

Parameters
targetstring to set as result
Ttemperature (Kelvin)
Tddewpoint (Kelvin)

Definition at line 179 of file bufr2tac_x12.c.

180{
181 int ix;
182 double dpd = T - Td;
183
184 if ( T == MISSING_REAL || Td == MISSING_REAL )
185 {
186 strcpy ( target, "//" );
187 return target;
188 }
189
190 if ( dpd < 0.0 )
191 {
192 return NULL;
193 }
194
195 if ( dpd > 50.0 )
196 {
197 strcpy ( target, "//" );
198 return target;
199 }
200
201 ix = ( int ) ( 10.0 * dpd );
202
203 if ( ix >= 55 )
204 {
205 ix = 50 + ( ix + 5 ) / 10;
206 }
207 sprintf ( target, "%02d", ix );
208
209 return target;
210}
#define MISSING_REAL
The missing default value for real values.
Definition: bufrdeco.h:78

References MISSING_REAL.

Referenced by parse_temp_raw_data().

Here is the caller graph for this function:

◆ kelvin_to_snTT()

char * kelvin_to_snTT ( char *  target,
double  T 
)

converts a kelvin temperature value into a snTT string

Parameters
Tthe temperature ( Kelvin )
targetstring with the result

Definition at line 69 of file bufr2tac_x12.c.

70{
71 int ic;
72 if ( T < 173.65 || T > 340.0 )
73 {
74 return NULL;
75 }
76
77 // Whole degrees (Celsius)
78 ic = ( int ) ( floor ( ( T - 273.15 ) + 0.5 ) );
79 if ( ic < 0 )
80 {
81 sprintf ( target, "1%02d", -ic );
82 }
83 else
84 {
85 sprintf ( target, "%03d", ic );
86 }
87 return target;
88}

Referenced by syn_parse_x12().

Here is the caller graph for this function:

◆ kelvin_to_snTTT()

char * kelvin_to_snTTT ( char *  target,
double  T 
)

converts a kelvin temperature value into a snTTT string

Parameters
Tthe temperature ( Kelvin )
targetstring with the result

Definition at line 32 of file bufr2tac_x12.c.

33{
34 int ic;
35 double Tx = T;
36
37 if ( Tx > 15 && Tx < 34.0 ) // guess there is an scale error on coding , we better manage T * 10
38 {
39 Tx *= 10.0;
40 }
41 if ( Tx < 173.205 || Tx > 340.0 )
42 {
43 return NULL;
44 }
45
46 // tenths of degree (Celsius)
47 // Patch introduced on 22-Dec-2019 due to some roundings errors from India and Australia
48 // not converting properly from Kelvin to Celsius for Tmax and Tmin
49 // Changed '0.5' to '0.45'
50 //ic = ( int ) ( floor ( 10.0 * ( Tx - 273.15 ) + 0.5 ) );
51 ic = ( int ) ( floor ( 10.0 * ( Tx - 273.15 ) + 0.45 ) );
52 if ( ic < 0 )
53 {
54 sprintf ( target, "1%03d", -ic );
55 }
56 else
57 {
58 sprintf ( target, "0%03d", ic );
59 }
60 return target;
61}

Referenced by buoy_parse_x12(), buoy_parse_x22(), climat_parse_x12(), syn_parse_x12(), syn_parse_x22(), and temp_parse_x22().

Here is the caller graph for this function:

◆ kelvin_to_TT()

char * kelvin_to_TT ( char *  target,
double  T 
)

converts a kelvin temperature value into a TT string

Parameters
Tthe temperature ( Kelvin )
targetstring with the result

Definition at line 96 of file bufr2tac_x12.c.

97{
98 int ic;
99 if ( T < 150.0 || T > 340.0 )
100 {
101 return NULL;
102 }
103
104 // Whole degrees (Celsius)
105 ic = ( int ) ( floor ( ( T - 273.15 ) + 0.5 ) );
106 if ( ic < 0 )
107 {
108 sprintf ( target, "%02d", 50 - ic );
109 }
110 else
111 {
112 sprintf ( target, "%02d", ic );
113 }
114 return target;
115}

Referenced by syn_parse_x12().

Here is the caller graph for this function:

◆ kelvin_to_TTTa()

char * kelvin_to_TTTa ( char *  target,
double  T 
)

Set temperature TTTa.

Parameters
targetresult as string
Ttemperature (kelvin)

Definition at line 147 of file bufr2tac_x12.c.

148{
149 int ix;
150
151 if ( T == MISSING_REAL )
152 {
153 sprintf ( target, "///" );
154 return target;
155 }
156
157 ix = ( int ) ( 10.0 * ( T - 273.15 ) );
158
159 if ( ix >= 0 )
160 {
161 ix &= ~1;
162 }
163 else
164 {
165 ix = ( -ix );
166 ix |= 1;
167 }
168 sprintf ( target, "%03d", ix );
169 return target;
170}

References MISSING_REAL.

Referenced by parse_temp_raw_data().

Here is the caller graph for this function:

◆ kelvin_to_TTTT()

char * kelvin_to_TTTT ( char *  target,
double  T 
)

converts a kelvin temperature value into a TTTT string

Parameters
Tthe temperature ( Kelvin )
targetstring with the result

Definition at line 123 of file bufr2tac_x12.c.

124{
125 int ic;
126 if ( T < 150.0 || T > 340.0 )
127 {
128 return NULL;
129 }
130 // hundreth of degrees (Celsius)
131 ic = ( int ) ( floor ( 100.0 * ( T - 273.15 ) + 0.5 ) );
132 if ( ic < 0 )
133 {
134 ic = 5000 - ic;
135 }
136 sprintf ( target, "%04d", ic );
137 return target;
138}

Referenced by buoy_parse_x22().

Here is the caller graph for this function:

◆ syn_parse_x12()

int syn_parse_x12 ( struct synop_chunks syn,
struct bufr2tac_subset_state s 
)

Parse a expanded descriptor with X = 12.

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 220 of file bufr2tac_x12.c.

221{
222 char aux[16];
223
224 if ( s->a->mask & DESCRIPTOR_VALUE_MISSING )
225 {
226 return 0;
227 }
228
229 switch ( s->a->desc.y )
230 {
231 case 1: // 0 12 001 . Air temperature
232 case 4: // 0 12 004 . Air temperatura at 2 m
233 case 101: // 0 12 101 . Air temperature
234 case 104: // 0 12 104 . Air temperature at 2 m
235 if ( syn->s1.TTT[0] == 0 )
236 {
237 if ( kelvin_to_snTTT ( aux, s->val ) )
238 {
239 syn->s1.sn1[0] = aux[0];
240 strcpy ( syn->s1.TTT, aux + 1 );
241 syn->mask |= SYNOP_SEC1;
242 }
243 else if ( BUFR2TAC_DEBUG_LEVEL > 0 )
244 bufr2tac_set_error ( s, 1, "syn_parse_x12()->kelvin_to_snTTT()", "Unspected parse problem" );
245 }
246 break;
247
248 case 3: // 0 12 003 . Dewpoint temperature
249 case 6: // 0 12 006 . Dewpoint temperature at 2 m
250 case 103: // 0 12 103 . Dewpoint temperature
251 case 106: // 0 12 106 . Dewpoint temperature at 2 m
252 if ( syn->s1.TdTdTd[0] == 0 )
253 {
254 if ( kelvin_to_snTTT ( aux, s->val ) )
255 {
256 syn->s1.sn2[0] = aux[0];
257 strcpy ( syn->s1.TdTdTd, aux + 1 );
258 syn->mask |= SYNOP_SEC1;
259 }
260 else if ( BUFR2TAC_DEBUG_LEVEL > 0 )
261 bufr2tac_set_error ( s, 1, "syn_parse_x12()->kelvin_to_snTTT()", "Unspected parse problem" );
262 }
263 break;
264
265 case 14: // 0 12 014 . Maximum temperature at 2 m , past 12 hours
266 case 21: // 0 12 021 . Maximum temperature.
267 case 114: // 0 12 114 . Maximum temperature at 2 m , past 12 hours
268 case 116: // 0 12 116 . Maximum temperature at 2 m , past 24 hours
269 if ( syn->s3.TxTxTx[0] == 0 && ( s->itval % ( 3 * 3600 ) ) == 0 ) // only for 3, 6 ... hours
270 {
271 if ( kelvin_to_snTTT ( aux, s->val ) )
272 {
273 syn->s3.snx[0] = aux[0];
274 strcpy ( syn->s3.TxTxTx, aux + 1 );
275 syn->mask |= SYNOP_SEC3;
276 }
277 else if ( BUFR2TAC_DEBUG_LEVEL > 0 )
278 bufr2tac_set_error ( s, 1, "syn_parse_x12()->kelvin_to_snTTT()", "Unspected parse problem" );
279 }
280 break;
281
282 case 11: // 0 12 011 . Maximum temperature at heigh and over the period specified
283 case 111: // 0 12 111 . Maximum temperature at heigh and over the period specified
284 if ( syn->s3.TxTxTx[0] == 0 &&
285 ( s->hsensor >= 1.0 || s->hsensor <= 0 ) &&
286 ( time_period_duration ( s ) % ( 12 * 3600 ) ) == 0 ) // only for 12 , 24 hours
287 {
288 if ( kelvin_to_snTTT ( aux, s->val ) )
289 {
290 syn->s3.snx[0] = aux[0];
291 strcpy ( syn->s3.TxTxTx, aux + 1 );
292 syn->mask |= SYNOP_SEC3;
293 }
294 else if ( BUFR2TAC_DEBUG_LEVEL > 0 )
295 bufr2tac_set_error ( s, 1, "syn_parse_x12()->kelvin_to_snTTT()", "Unspected parse problem" );
296 }
297 break;
298
299
300 case 15: // 0 12 015 . Minimum temperature at 2 m , past 12 hours
301 case 22: // 0 12 022 . Minimum temperature.
302 case 115: // 0 12 115 . Minimum temperature at 2 m , past 12 hours
303 case 117: // 0 12 117 . Minimum temperature at 2 m , past 24 hours
304 if ( syn->s3.TnTnTn[0] == 0 && ( s->itval % ( 3 * 3600 ) ) == 0 ) // only for 3, 6 ... hours
305 {
306 if ( kelvin_to_snTTT ( aux, s->val ) )
307 {
308 syn->s3.snn[0] = aux[0];
309 strcpy ( syn->s3.TnTnTn, aux + 1 );
310 syn->mask |= SYNOP_SEC3;
311 }
312 else if ( BUFR2TAC_DEBUG_LEVEL > 0 )
313 bufr2tac_set_error ( s, 1, "syn_parse_x12()->kelvin_to_snTTT()", "Unspected parse problem" );
314 }
315 break;
316
317 case 12: // 0 12 012 . Minimum temperature at heigh and over the period specified
318 case 112: // 0 12 112 . Minimum temperature at heigh and over the period specified
319 if ( syn->s3.TnTnTn[0] == 0 &&
320 ( s->hsensor >= 1.0 || s->hsensor <= 0 ) &&
321 ( time_period_duration ( s ) % ( 12 * 3600 ) ) == 0 ) // only for 12 , 24 hours
322 {
323 if ( kelvin_to_snTTT ( aux, s->val ) )
324 {
325 syn->s3.snn[0] = aux[0];
326 strcpy ( syn->s3.TnTnTn, aux + 1 );
327 syn->mask |= SYNOP_SEC3;
328 }
329 else if ( BUFR2TAC_DEBUG_LEVEL > 0 )
330 bufr2tac_set_error ( s, 1, "syn_parse_x12()->kelvin_to_snTTT()", "Unspected parse problem" );
331 }
332 break;
333
334 case 2: // 0 12 002 . Wet bulb temperature
335 case 5: // 0 12 005 . Wet bulb temperature at 2 m
336 case 102: // 0 12 102 . Wet bulb temperature
337 case 105: // 0 12 105 . Wet bulb temperature at 2 m
338 if ( syn->s2.TbTbTb[0] == 0 )
339 {
340 if ( kelvin_to_snTTT ( aux, s->val ) )
341 {
342 syn->s2.sw[0] = aux[0];
343 strcpy ( syn->s2.TbTbTb, aux + 1 );
344 syn->mask |= SYNOP_SEC2;
345 }
346 else if ( BUFR2TAC_DEBUG_LEVEL > 0 )
347 bufr2tac_set_error ( s, 1, "syn_parse_x12()->kelvin_to_snTTT()", "Unspected parse problem" );
348 }
349 break;
350
351 case 113: // 0 12 113 . Ground minimum temperature, past 12 hours
352 if ( strcmp ( "6", syn->s0.A1 ) == 0 ||
353 strcmp ( "3", syn->s0.A1 ) == 0 ||
354 strcmp ( "2", syn->s0.A1 ) == 0
355 ) // region III or VI
356 {
357 if ( kelvin_to_snTT ( aux, s->val ) )
358 {
359 strcpy ( syn->s3.jjj, aux );
360 syn->mask |= SYNOP_SEC3;
361 }
362 else if ( BUFR2TAC_DEBUG_LEVEL > 0 )
363 bufr2tac_set_error ( s, 1, "syn_parse_x12()->kelvin_to_snTT()", "Unspected parse problem" );
364 }
365 else if ( strcmp ( "1", syn->s0.A1 ) == 0 )
366 {
367 if ( kelvin_to_TT ( aux, s->val ) )
368 {
369 syn->s3.XoXoXoXo[0] = aux[0];
370 syn->s3.XoXoXoXo[1] = aux[1];
371 if ( syn->s3.XoXoXoXo[2] == 0 )
372 {
373 syn->s3.XoXoXoXo[2] = '/';
374 }
375 if ( syn->s3.XoXoXoXo[3] == 0 )
376 {
377 syn->s3.XoXoXoXo[3] = '/';
378 }
379 syn->mask |= SYNOP_SEC3;
380 }
381 else if ( BUFR2TAC_DEBUG_LEVEL > 0 )
382 bufr2tac_set_error ( s, 1, "syn_parse_x12()->kelvin_to_snTT()", "Unspected parse problem" );
383 }
384 break;
385
386 case 121: // 0 12 121 . Ground minimum temperature (at the time of observation)
387 if ( strcmp ( "2", syn->s0.A1 ) == 0 ) // region II
388 {
389 if ( kelvin_to_snTT ( aux, s->val ) )
390 {
391 syn->s3.XoXoXoXo[1] = aux[0];
392 syn->s3.XoXoXoXo[2] = aux[1];
393 syn->s3.XoXoXoXo[3] = aux[2];
394 syn->mask |= SYNOP_SEC3;
395 }
396 else if ( BUFR2TAC_DEBUG_LEVEL > 0 )
397 bufr2tac_set_error ( s, 1, "syn_parse_x12()->kelvin_to_snTT()", "Unspected parse problem" );
398 }
399 break;
400
401 case 120: // 0 12 120 . Ground temperature
402 if ( strcmp ( "2", syn->s0.A1 ) == 0 ) // Only for Region II
403 {
404 if ( kelvin_to_snTT ( aux, s->val ) )
405 {
406 if ( syn->s3.E1[0] )
407 syn->s3.XoXoXoXo[0] = '/';
408 else if ( syn->s3.E[0] )
409 syn->s3.XoXoXoXo[0] = syn->s3.E[0];
410 syn->s3.XoXoXoXo[1] = aux[0];
411 syn->s3.XoXoXoXo[2] = aux[1];
412 syn->s3.XoXoXoXo[3] = aux[2];
413 }
414 else if ( BUFR2TAC_DEBUG_LEVEL > 0 )
415 bufr2tac_set_error ( s, 1, "syn_parse_x12()->kelvin_to_snTT()", "Unspected parse problem" );
416 }
417 break;
418
419 case 122: // 0 12 122 . Ground minimum temperature during preceding night
420 if ( strcmp ( "1", syn->s0.A1 ) == 0 ) // Only for Region I
421 {
422 if ( kelvin_to_TT ( aux, s->val ) )
423 {
424 syn->s3.XoXoXoXo[0] = aux[0];
425 syn->s3.XoXoXoXo[1] = aux[1];
426 if ( syn->s3.XoXoXoXo[2] == 0 )
427 {
428 syn->s3.XoXoXoXo[2] = '/';
429 }
430 if ( syn->s3.XoXoXoXo[3] == 0 )
431 {
432 syn->s3.XoXoXoXo[3] = '/';
433 }
434 syn->mask |= SYNOP_SEC3;
435 }
436 else if ( BUFR2TAC_DEBUG_LEVEL > 0 )
437 bufr2tac_set_error ( s, 1, "syn_parse_x12()->kelvin_to_TT()", "Unspected parse problem" );
438 }
439 else if ( strcmp ( "2", syn->s0.A1 ) == 0 ||
440 strcmp ( "3", syn->s0.A1 ) == 0 ) // Region II and III
441 {
442 if ( kelvin_to_snTT ( aux, s->val ) )
443 {
444 strcpy ( syn->s3.jjj, aux );
445 syn->mask |= SYNOP_SEC3;
446 }
447 }
448 break;
449
450 default:
451 if ( BUFR2TAC_DEBUG_LEVEL > 1 && (s->a->mask & DESCRIPTOR_VALUE_MISSING) == 0 )
452 bufr2tac_set_error ( s, 0, "syn_parse_x12()", "Descriptor not parsed" );
453 break;
454 }
455 return 0;
456}
int time_period_duration(struct bufr2tac_subset_state *s)
Get time period duration in seconds.
Definition: bufr2tac_x04.c:33
char * kelvin_to_TT(char *target, double T)
converts a kelvin temperature value into a TT string
Definition: bufr2tac_x12.c:96
char * kelvin_to_snTT(char *target, double T)
converts a kelvin temperature value into a snTT string
Definition: bufr2tac_x12.c:69
#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_SEC2
mask bit meaning section 2 or synop is solicited to or parsed with success
Definition: metsynop.h:44
struct synop_sec1 s1
Definition: metsynop.h:298
struct synop_sec2 s2
Definition: metsynop.h:299
struct synop_sec3 s3
Definition: metsynop.h:300
struct synop_sec0 s0
Definition: metsynop.h:297
char A1[2]
Definition: metsynop.h:94
char sn1[2]
Definition: metsynop.h:131
char sn2[2]
Definition: metsynop.h:133
char TdTdTd[4]
Definition: metsynop.h:134
char TTT[4]
Definition: metsynop.h:132
char TbTbTb[6]
Definition: metsynop.h:182
char sw[2]
Definition: metsynop.h:181
char TnTnTn[4]
Definition: metsynop.h:226
char E[2]
Definition: metsynop.h:227
char XoXoXoXo[6]
Definition: metsynop.h:222
char TxTxTx[4]
Definition: metsynop.h:224
char snn[2]
Definition: metsynop.h:225
char E1[2]
Definition: metsynop.h:229
char snx[2]
Definition: metsynop.h:223
char jjj[4]
Definition: metsynop.h:228

References bufr2tac_subset_state::a, synop_sec0::A1, BUFR2TAC_DEBUG_LEVEL, bufr2tac_set_error(), bufr_atom_data::desc, DESCRIPTOR_VALUE_MISSING, synop_sec3::E, synop_sec3::E1, bufr2tac_subset_state::hsensor, bufr2tac_subset_state::itval, synop_sec3::jjj, kelvin_to_snTT(), kelvin_to_snTTT(), kelvin_to_TT(), bufr_atom_data::mask, synop_chunks::mask, synop_chunks::s0, synop_chunks::s1, synop_chunks::s2, synop_chunks::s3, synop_sec1::sn1, synop_sec1::sn2, synop_sec3::snn, synop_sec3::snx, synop_sec2::sw, SYNOP_SEC1, SYNOP_SEC2, SYNOP_SEC3, synop_sec2::TbTbTb, synop_sec1::TdTdTd, time_period_duration(), synop_sec3::TnTnTn, synop_sec1::TTT, synop_sec3::TxTxTx, 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:

◆ temp_parse_x12()

int temp_parse_x12 ( struct temp_chunks t,
struct bufr2tac_subset_state s 
)

Parse a expanded descriptor with X = 12.

Parameters
tpointer to a struct temp_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 751 of file bufr2tac_x12.c.

752{
753 if ( t == NULL )
754 {
755 return 1;
756 }
757
758 switch ( s->a->desc.y )
759 {
760 case 101: // 0 12 101. Temperature/dry-bulb temperature (scale 2)
761 if ( s->rep > 0 && s->r->n > 0 )
762 {
763 if ( s->a->mask & DESCRIPTOR_VALUE_MISSING )
764 {
765 s->r->raw[s->r->n - 1].T = MISSING_REAL;
766 }
767 else
768 {
769 s->r->raw[s->r->n - 1].T = s->val;
770 }
771 }
772 break;
773
774 case 103: // 0 12 103. Dew-point temperature (scale 2)
775 if ( s->rep > 0 && s->r->n > 0 )
776 {
777 if ( s->a->mask & DESCRIPTOR_VALUE_MISSING )
778 {
779 s->r->raw[s->r->n - 1].Td = MISSING_REAL;
780 }
781 else
782 {
783 s->r->raw[s->r->n - 1].Td = s->val;
784 }
785 }
786 break;
787
788 default:
789 if ( BUFR2TAC_DEBUG_LEVEL > 1 && (s->a->mask & DESCRIPTOR_VALUE_MISSING) == 0 )
790 bufr2tac_set_error ( s, 0, "temp_parse_x12()", "Descriptor not parsed" );
791 break;
792 }
793
794 return 0;
795}
struct temp_raw_data * r
Definition: bufr2tac.h:285
struct temp_raw_point_data raw[TEMP_NMAX_POINTS *4]
Definition: mettemp.h:215
size_t n
Definition: mettemp.h:214

References bufr2tac_subset_state::a, BUFR2TAC_DEBUG_LEVEL, bufr2tac_set_error(), bufr_atom_data::desc, DESCRIPTOR_VALUE_MISSING, bufr_atom_data::mask, MISSING_REAL, temp_raw_data::n, bufr2tac_subset_state::r, temp_raw_data::raw, bufr2tac_subset_state::rep, temp_raw_point_data::T, temp_raw_point_data::Td, bufr2tac_subset_state::val, and bufr_descriptor::y.

Referenced by parse_subset_as_temp().

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