NCEPLIBS-bufr  11.5.0
 All Data Structures Files Functions Variables Pages
debufr.f
Go to the documentation of this file.
1 C> @file
2 C> @brief Fortran language code for debufr utility.
3 
4 C> This module is used within the debufr utility to share
5 C> information between subroutine fdebufr() and subroutine
6 C> openbt(), since the latter is not called by the former but
7 C> rather is called directly from within the BUFRLIB software.
8 
10 
11 C> @var ctbldir
12 C> Directory containing DX BUFR tables to be used for
13 C> decoding.
14 C>
15 C> @var ltbd
16 C> Length (in characters) of ctbldir.
17 C>
18 C> @var ludx
19 C> Fortran logical unit number to use for referencing
20 C> a DX table.
21 
22  character*120 ctbldir
23  integer ltbd, ludx
24  END MODULE
25 
26 C> This subroutine reads, decodes, and generates a verbose output
27 C> listing of the contents of every BUFR message from within the
28 C> input file that was previously opened via a call to subroutine
29 C> cobfl() with io = 'r'.
30 C>
31 C> @author J. Ator
32 C> @date 2009-07-01
33 C>
34 C> @param[in] ofile - character*(*): File to contain verbose output
35 C> listing of contents of each decoded BUFR message
36 C> @param[in] tbldir - character*(*): Directory containing DX and/or
37 C> master BUFR tables to be used for decoding
38 C> @param[in] lentd - integer: length of tbldir string
39 C> @param[in] tblfil - character*(*): File containing DX BUFR table
40 C> information to be used for decoding
41 C> - 'NULLFILE' = No such file will be used
42 C> @param[in] prmstg - character*(*): String of up to 20 comma-separated
43 C> PARAMETER=VALUE pairs to be used to dynamically
44 C> allocate memory within the BUFRLIB software,
45 C> overriding the default VALUE that would otherwise
46 C> be used for each such PARAMETER.
47 C> - 'NULLPSTG' = No such pairs will be used
48 C> @param[in] basic - character: Indicator as to whether only "basic"
49 C> information in Sections 0-3 should be decoded
50 C> from each BUFR message:
51 C> - 'Y' = Yes
52 C> - 'N' = No
53 C> @param[in] forcemt - character: Indicator as to whether master BUFR
54 C> tables should be used for decoding, regardless
55 C> of whether the input file contains any embedded
56 C> DX BUFR table messages:
57 C> - 'Y' = Yes
58 C> - 'N' = No
59 C> @param[in] cfms - character: Indicator as to whether code and flag
60 C> table meanings should be read from master BUFR
61 C> tables and included in the print output:
62 C> - 'Y' = Yes
63 C> - 'N' = No
64 C>
65 C> @remarks
66 C> - See BUFRLIB function isetprm() for a complete list of parameters
67 C> that can be dynamically sized via prmstg.
68 C> - Fortran logical unit numbers 51, 90, 91, 92 and 93 are reserved
69 C> for use within this subroutine.
70 C>
71 C> <b>Program history log:</b>
72 C> - 2009-07-01 J. Ator -- Original author
73 C> - 2012-06-18 J. Ator -- Added tblfil argument and options to decode
74 C> files according to DX dictionary information
75 C> - 2012-12-07 J. Ator -- Added forcemt and lentd arguments
76 C> - 2013-10-07 J. Ator -- Print Section 1 tank receipt time information
77 C> for NCEP/NCO BUFR messages if available
78 C> - 2013-11-15 J. Ator -- Added check for missing or unreadable tblfil
79 C> - 2014-09-15 J. Ator -- Confirm BUFR file was opened (i.e. at least
80 C> one good return from crbmg() before calling
81 C> dxdump().
82 C> - 2018-01-19 J. Ator -- Added print of code and flag table meanings.
83 C> - 2018-03-01 J. Ator -- Added print of data types and subtypes from
84 C> code and flag tables.
85 C> - 2018-09-05 J. Ator -- Added prmstg argument
86 C> - 2019-02-01 J. Ator -- Remove limit on length of prmstg
87 C> - 2021-02-24 J. Ator -- Use all formatted writes, for consistent
88 C> output between builds using 4-byte vs. 8-byte
89 C> integers
90 C>
91  SUBROUTINE fdebufr ( ofile, tbldir, lentd, tblfil, prmstg,
92  + basic, forcemt, cfms )
93 
95 
96  parameter( mxbf = 2500000 )
97  parameter( mxbfd4 = mxbf/4 )
98  parameter( mxds3 = 500 )
99  parameter( mxprms = 20 )
100 
101  character*(*) ofile, tbldir, tblfil, prmstg
102 
103  logical exists
104 
105  character*120 cmorgc, cmgses, cmmtyp, cmmsbt, cmmsbti
106  character*20 ptag( mxprms ), pvtag(2), cprmnm
107  character*8 cmgtag
108  character*6 cds3( mxds3 )
109  character*1 basic, forcemt, opened, usemt, cfms,
110  + bfmg( mxbf )
111 
112  integer ibfmg( mxbfd4 )
113 
114  equivalence( bfmg(1), ibfmg(1) )
115 
116 C-----------------------------------------------------------------------
117 C-----------------------------------------------------------------------
118 
119 C Open the output file.
120 
121  OPEN ( unit = 51, file = ofile )
122 
123 C Note that in the below OPEN statement we just need to specify
124 C a dummy placeholder file.
125 
126  lunit = 92
127  OPEN ( unit = lunit, file = '/dev/null' )
128 
129  CALL datelen( 10 )
130 
131 C Initialize the values in the Share_Table_Info module.
132 
133  ludx = 93
134  ltbd = lentd
135  ctbldir = tbldir(1:lentd)
136 
137 C Initialize some other values.
138 
139  nmsg = 0
140  nsubt = 0
141 
142  opened = 'N'
143  usemt = 'N'
144 
145  DO WHILE ( .true. )
146 
147 C Get the next message from the input BUFR file.
148 
149  CALL crbmg( bfmg, mxbf, nbyt, ierr )
150 
151  IF ( ierr .ne. 0 ) THEN
152 
153  IF ( ierr .eq. -1 ) THEN
154  WRITE ( unit = 51, fmt = '( /, 2A, I7, A, I9, A )')
155  + 'Reached end of BUFR file; it contained a total ',
156  + 'of', nmsg, ' messages and', nsubt, ' subsets'
157  ELSE
158  WRITE ( unit = 51, fmt = '( /, 2A, I4 )' )
159  + 'Error while reading BUFR file; the return code ',
160  + 'from CRBMG = ', ierr
161  ENDIF
162 
163  IF ( ( basic .eq. 'N' ) .and. ( opened .eq. 'Y' ) ) THEN
164  WRITE (51, fmt = '( /, A, / )' )
165  + 'Here is the DX table that was generated:'
166  CALL dxdump( lunit, 51 )
167  ENDIF
168 
169 C Close the output file and return.
170 
171  CLOSE ( 51 )
172  RETURN
173  ENDIF
174 
175  IF ( opened .eq. 'N' ) THEN
176 
177  CALL isetprm( 'MAXCD', mxds3 )
178  CALL isetprm( 'MXMSGL', mxbf )
179  CALL isetprm( 'MAXSS', 300000 )
180  CALL isetprm( 'NFILES', 2 )
181 
182 C Process any dynamic allocation parameters that were
183 C passed in on the command line.
184 
185  IF ( prmstg(1:8) .ne. 'NULLPSTG' ) THEN
186  CALL parstr( prmstg, ptag, mxprms, nptag, ',',
187  + .false. )
188  IF ( nptag .gt. 0 ) THEN
189  DO ii = 1, nptag
190  CALL parstr( ptag(ii), pvtag, 2, npvtag, '=',
191  + .false. )
192  IF ( npvtag .eq. 2 ) THEN
193  CALL strsuc( pvtag(1), cprmnm, lcprmnm )
194  CALL strnum( pvtag(2), ipval )
195  IF ( ( lcprmnm .gt. 0 ) .and.
196  + ( ipval .ne. -1 ) )
197  + CALL isetprm( cprmnm(1:lcprmnm), ipval )
198  ENDIF
199  ENDDO
200  ENDIF
201  ENDIF
202 
203 C Decide how to process the file.
204 
205  IF ( ( idxmsg( ibfmg ) .eq. 1 ) .and.
206  + ( forcemt .eq. 'N' ) ) THEN
207 
208 C The first message in the file is a DX dictionary
209 C message, so assume there's an embedded table at the
210 C front of the file and use this table to decode it.
211 
212  CALL openbf( lunit, 'INUL', lunit )
213  ELSE IF ( ( tblfil(1:8) .ne. 'NULLFILE' ) .and.
214  + ( forcemt .eq. 'N' ) ) THEN
215 
216 C A DX dictionary tables file was specified on the
217 C command line, so use it to decode the BUFR file.
218 
219  INQUIRE ( file = tblfil, exist = exists )
220  IF ( .not. exists ) THEN
221  print *, 'ERROR: COULD NOT FIND FILE ', tblfil
222  RETURN
223  ENDIF
224  OPEN ( unit = 91, file = tblfil, iostat = ier )
225  IF ( ier .ne. 0 ) THEN
226  print *, 'ERROR: COULD NOT OPEN FILE ', tblfil
227  RETURN
228  ENDIF
229  CALL openbf( lunit, 'IN', 91 )
230  ELSE
231 
232 C Decode the file using the master tables in tbldir.
233 
234  usemt = 'Y'
235  CALL openbf( lunit, 'SEC3', lunit )
236  ENDIF
237 
238  opened = 'Y'
239 
240  CALL mtinfo( tbldir, 90, 91 )
241  IF ( cfms .eq. 'Y' ) CALL codflg( 'Y' )
242  ENDIF
243 
244  IF ( basic .eq. 'N' ) THEN
245 
246 C Pass the message to the decoder.
247 
248  CALL readerme( ibfmg, lunit, cmgtag, imgdt, ierme )
249  ENDIF
250 
251 C If this is a DX dictionary message, then don't generate any
252 C output unless master tables are being used for decoding.
253 
254  IF ( ( idxmsg( ibfmg ) .ne. 1 ) .or.
255  + ( usemt .eq. 'Y' ) ) THEN
256 
257  nmsg = nmsg + 1
258 
259  WRITE ( unit = 51, fmt = '( /, A, I7 )' )
260  + 'Found BUFR message #', nmsg
261 
262 C Decode and output the data from Section 0.
263 
264  WRITE ( 51, fmt= '( /, A, I9 )' )
265  + ' Message length: ',
266  + iupbs01( ibfmg, 'LENM' )
267  WRITE ( 51, fmt= '( A, I4 )' )
268  + ' Section 0 length: ',
269  + iupbs01( ibfmg, 'LEN0' )
270  WRITE ( 51, fmt= '( A, I4 )' )
271  + ' BUFR edition: ',
272  + iupbs01( ibfmg, 'BEN' )
273 
274 C Decode and output the data from Section 1.
275 
276  WRITE ( 51, fmt= '( /, A, I4 )' )
277  + ' Section 1 length: ',
278  + iupbs01( ibfmg, 'LEN1' )
279  WRITE ( 51, fmt= '( A, I4 )' )
280  + ' Master table: ',
281  + iupbs01( ibfmg, 'BMT' )
282 
283  iogce = iupbs01( ibfmg, 'OGCE' )
284  igses = iupbs01( ibfmg, 'GSES' )
285  IF ( ( basic .eq. 'Y' ) .or.
286  + ( cfms .eq. 'N' ) ) THEN
287  WRITE ( 51, fmt= '( A, I5 )' )
288  + ' Originating center: ', iogce
289  WRITE ( 51, fmt= '( A, I4 )' )
290  + ' Originating subcenter: ', igses
291  ELSE
292  CALL getcfmng( lunit, 'ORIGC', iogce, ' ', -1,
293  + cmorgc, lcmorgc, ierorgc )
294  IF ( ierorgc .eq. 0 ) THEN
295  WRITE ( 51, fmt= '( A, I5, 3A )' )
296  + ' Originating center: ', iogce,
297  + ' (= ', cmorgc(1:lcmorgc), ')'
298  ELSE
299  WRITE ( 51, fmt= '( A, I5 )' )
300  + ' Originating center: ', iogce
301  ENDIF
302  CALL getcfmng( lunit, 'GSES', igses,
303  + 'ORIGC', iogce,
304  + cmgses, lcmgses, iergses )
305  IF ( iergses .eq. 0 ) THEN
306  WRITE ( 51, fmt= '( A, I4, 3A )' )
307  + ' Originating subcenter: ', igses,
308  + ' (= ', cmgses(1:lcmgses), ')'
309  ELSE
310  WRITE ( 51, fmt= '( A, I4 )' )
311  + ' Originating subcenter: ', igses
312  ENDIF
313  ENDIF
314 
315  WRITE ( 51, fmt= '( A, I4 )' )
316  + ' Update sequence numbr: ',
317  + iupbs01( ibfmg, 'USN' )
318 
319  IF ( iupbs01( ibfmg, 'ISC2' ) .eq. 1 ) THEN
320  WRITE ( 51, fmt = '( A )')
321  + ' Section 2 present?: Yes'
322  ELSE
323  WRITE ( 51, fmt = '( A )')
324  + ' Section 2 present?: No'
325  ENDIF
326 
327  mtyp = iupbs01( ibfmg, 'MTYP' )
328  msbt = iupbs01( ibfmg, 'MSBT' )
329  msbti = iupbs01( ibfmg, 'MSBTI' )
330  IF ( ( basic .eq. 'Y' ) .or.
331  + ( cfms .eq. 'N' ) ) THEN
332  WRITE ( 51, fmt= '( A, I4 )' )
333  + ' Data category: ', mtyp
334  WRITE ( 51, fmt= '( A, I4 )' )
335  + ' Local subcategory: ', msbt
336  WRITE ( 51, fmt= '( A, I4 )' )
337  + ' Internatl subcategory: ', msbti
338  ELSE
339  CALL getcfmng( lunit, 'TABLAT', mtyp, ' ', -1,
340  + cmmtyp, lcmmtyp, iermtyp )
341  IF ( iermtyp .eq. 0 ) THEN
342  WRITE ( 51, fmt= '( A, I4, 3A )' )
343  + ' Data category: ', mtyp,
344  + ' (= ', cmmtyp(1:lcmmtyp), ')'
345  ELSE
346  WRITE ( 51, fmt= '( A, I4 )' )
347  + ' Data category: ', mtyp
348  ENDIF
349  CALL getcfmng( lunit, 'TABLASL', msbt,
350  + 'TABLAT', mtyp,
351  + cmmsbt, lcmmsbt, iermsbt )
352  IF ( ( iermsbt .eq. 0 ) .and.
353  + ( iogce .eq. 7 ) ) THEN
354  WRITE ( 51, fmt= '( A, I4, 3A )' )
355  + ' Local subcategory: ', msbt,
356  + ' (= ', cmmsbt(1:lcmmsbt), ')'
357  ELSE
358  WRITE ( 51, fmt= '( A, I4 )' )
359  + ' Local subcategory: ', msbt
360  ENDIF
361  CALL getcfmng( lunit, 'TABLASS', msbti,
362  + 'TABLAT', mtyp,
363  + cmmsbti, lcmmsbti, iermsbti )
364  IF ( iermsbti .eq. 0 ) THEN
365  WRITE ( 51, fmt= '( A, I4, 3A )' )
366  + ' Internatl subcategory: ', msbti,
367  + ' (= ', cmmsbti(1:lcmmsbti), ')'
368  ELSE
369  WRITE ( 51, fmt= '( A, I4 )' )
370  + ' Internatl subcategory: ', msbti
371  ENDIF
372  ENDIF
373 
374  WRITE ( 51, fmt= '( A, I4 )' )
375  + ' Master table version: ',
376  + iupbs01( ibfmg, 'MTV' )
377  WRITE ( 51, fmt= '( A, I4 )' )
378  + ' Local table version: ',
379  + iupbs01( ibfmg, 'MTVL' )
380  WRITE ( 51, fmt= '( A, I4 )' )
381  + ' Year: ',
382  + iupbs01( ibfmg, 'YEAR' )
383  WRITE ( 51, fmt= '( A, I4 )' )
384  + ' Month: ',
385  + iupbs01( ibfmg, 'MNTH' )
386  WRITE ( 51, fmt= '( A, I4 )' )
387  + ' Day: ',
388  + iupbs01( ibfmg, 'DAYS' )
389  WRITE ( 51, fmt= '( A, I4 )' )
390  + ' Hour: ',
391  + iupbs01( ibfmg, 'HOUR' )
392  WRITE ( 51, fmt= '( A, I4 )' )
393  + ' Minute: ',
394  + iupbs01( ibfmg, 'MINU' )
395  WRITE ( 51, fmt= '( A, I4 )' )
396  + ' Second: ',
397  + iupbs01( ibfmg, 'SECO' )
398  IF ( ( iogce .eq. 7 ) .and. ( igses .eq. 3 ) ) THEN
399  CALL rtrcptb( ibfmg, iryr, irmo, irdy, irhr,
400  + irmi, irtret )
401  IF ( irtret .eq. 0 ) THEN
402  WRITE ( 51, fmt= '( A, I4 )' )
403  + ' NCEP tank rcpt year: ', iryr
404  WRITE ( 51, fmt= '( A, I4 )' )
405  + ' NCEP tank rcpt month: ', irmo
406  WRITE ( 51, fmt= '( A, I4 )' )
407  + ' NCEP tank rcpt day: ', irdy
408  WRITE ( 51, fmt= '( A, I4 )' )
409  + ' NCEP tank rcpt hour: ', irhr
410  WRITE ( 51, fmt= '( A, I4 )' )
411  + ' NCEP tank rcpt minute: ', irmi
412  END IF
413  END IF
414 
415 C Decode and output the data from Section 3.
416 
417  nsub = iupbs3( ibfmg, 'NSUB' )
418  WRITE ( 51, fmt= '( /, A, I4 )' )
419  + ' Number of data subsets: ', nsub
420  nsubt = nsubt + nsub
421 
422  IF ( iupbs3( ibfmg, 'IOBS' ) .eq. 1 ) THEN
423  WRITE ( 51, fmt = '( A )')
424  + ' Data are observed?: Yes'
425  ELSE
426  WRITE ( 51, fmt = '( A )')
427  + ' Data are observed?: No'
428  ENDIF
429 
430  IF ( iupbs3( ibfmg, 'ICMP' ) .eq. 1 ) THEN
431  WRITE ( 51, fmt = '( A )')
432  + ' Data are compressed?: Yes'
433  ELSE
434  WRITE ( 51, fmt = '( A )')
435  + ' Data are compressed?: No'
436  ENDIF
437 
438  CALL upds3( ibfmg, mxds3, cds3, nds3 )
439  WRITE ( 51, fmt= '( A, I5 )' )
440  + ' Number of descriptors: ', nds3
441  DO jj = 1, nds3
442  WRITE ( 51, fmt = '( 5X, I4, A, A6)' )
443  + jj, ": ", cds3( jj )
444  END DO
445 
446  IF ( ( basic .eq. 'N' ) .and.
447  + ( ierme .ge. 0 ) ) THEN
448 
449 C Decode and output the data from Section 4.
450 
451  WRITE ( unit = 51,
452  + fmt = '( /, A, I7, 3A, I10, A, I6, A )' )
453  + 'BUFR message #', nmsg, ' of type ', cmgtag,
454  + ' and date ', imgdt, ' contains ', nsub,
455  + ' subsets:'
456  DO WHILE ( ireadsb( lunit ) .eq. 0 )
457  CALL ufdump( lunit, 51 )
458  ENDDO
459  ENDIF
460 
461  WRITE ( unit = 51, fmt = '( /, A, I7 )' )
462  + 'End of BUFR message #', nmsg
463  WRITE ( unit = 51, fmt = '( /, 120("-"))' )
464  ENDIF
465 
466  ENDDO
467 
468  RETURN
469  END
470 
471 C> This subroutine overrides the placeholder subroutine of the same
472 C> name within the BUFRLIB distribution package.
473 C>
474 C> <p>Given the data category for a BUFR message, it opens the
475 C> appropriate DX BUFR tables file to use in reading/decoding
476 C> the message.
477 C>
478 C> @author J. Ator
479 C> @date 2012-12-07
480 C>
481 C> @param[in] mtyp - integer: Data category of BUFR message
482 C> @param[out] lundx - integer: Fortran logical unit number for
483 C> DX BUFR tables file to use in
484 C> reading/decoding the message
485 C> - 0 = No such file is available
486 C>
487 C> <b>Program history log:</b>
488 C> - 2012-12-07 J. Ator -- Original author
489 C>
490  SUBROUTINE openbt ( lundx, mtyp )
491 
492  USE share_table_info
493 
494  character*11 bftab
495 
496  character*240 bftabfil
497 
498  logical exists
499 
500 C-----------------------------------------------------------------------
501 C-----------------------------------------------------------------------
502 
503  WRITE ( bftab, '("bufrtab.",i3.3)' ) mtyp
504  bftabfil = ctbldir(1:ltbd) // '/' // bftab
505 
506  INQUIRE ( file = bftabfil, exist = exists )
507  IF ( exists ) THEN
508  lundx = ludx
509  CLOSE ( lundx )
510  OPEN ( unit = lundx, file = bftabfil )
511  ELSE
512  lundx = 0
513  END IF
514 
515  RETURN
516  END
subroutine codflg(CF)
This subroutine is used to specify whether or not code and flag table information should be included ...
Definition: codflg.f:43
function iupbs3(MBAY, S3MNEM)
This function returns a specified value from within Section 3 of a BUFR message.
Definition: iupbs3.f:32
subroutine dxdump(LUNIT, LDXOT)
This subroutine prints a copy of the DX BUFR table associated with a specified Fortran logical unit...
Definition: dxdump.f:44
function ireadsb(LUNIT)
This function calls BUFRLIB subroutine readsb() and passes back its return code as the function value...
Definition: ireadsb.f:30
subroutine strsuc(STR1, STR2, LENS)
THIS SUBROUTINE REMOVES LEADING AND TRAILING BLANKS FROM A STRING.
Definition: strsuc.f:34
subroutine parstr(STR, TAGS, MTAG, NTAG, SEP, LIMIT80)
THIS SUBROUTINE PARSES A STRING CONTAINING ONE OR MORE SUBSTRINGS INTO AN ARRAY OF SUBSTRINGS...
Definition: parstr.f:37
subroutine datelen(LEN)
This subroutine is used to specify the format of Section 1 date-time values that will be output by fu...
Definition: datelen.f:39
subroutine fdebufr(ofile, tbldir, lentd, tblfil, prmstg, basic, forcemt, cfms)
This subroutine reads, decodes, and generates a verbose output listing of the contents of every BUFR ...
Definition: debufr.f:91
subroutine rtrcptb(MBAY, IYR, IMO, IDY, IHR, IMI, IRET)
This subroutine reads the tank receipt time (if one exists) from Section 1 of a BUFR message...
Definition: rtrcptb.f:29
subroutine mtinfo(CMTDIR, LUNMT1, LUNMT2)
This subroutine allows the specification of the directory location and Fortran logical unit numbers t...
Definition: mtinfo.f:44
subroutine openbf(LUNIT, IO, LUNDX)
This subroutine connects a new file to the BUFRLIB software for input or output operations.
Definition: openbf.F:157
subroutine strnum(STR, NUM)
THIS SUBROUTINE DECODES AN INTEGER FROM A CHARACTER STRING.
Definition: strnum.f:33
This module is used within the debufr utility to share information between subroutine fdebufr() and s...
Definition: debufr.f:9
subroutine upds3(MBAY, LCDS3, CDS3, NDS3)
This subroutine returns the sequence of data descriptors contained within Section 3 of a BUFR message...
Definition: upds3.f:33
INTEGER function isetprm(CPRMNM, IPVAL)
This function sets a specified parameter to a specified value for use in dynamically allocating one o...
Definition: isetprm.F:101
subroutine readerme(MESG, LUNIT, SUBSET, JDATE, IRET)
This subroutine is similar to subroutine readmg(), except that it reads a BUFR message from an array ...
Definition: readerme.f:93
function idxmsg(MESG)
THIS FUNCTION DETERMINES WHETHER THE GIVEN BUFR MESSAGE IS A DX DICTIONARY MESSAGE THAT WAS CREATED B...
Definition: idxmsg.f:29
void crbmg(char *, f77int *, f77int *, f77int *)
This subroutine reads the next BUFR message from the system file that was opened via the most recent ...
Definition: crbmg.c:46
subroutine openbt(LUNDX, MTYP)
This subroutine is called as a last resort from within subroutine cktaba(), in the event the latter s...
Definition: openbt.f:39
subroutine ufdump(LUNIT, LUPRT)
This subroutine prints a verbose listing of the contents of a data subset, including all data values ...
Definition: ufdump.f:71
subroutine getcfmng(LUNIT, NEMOI, IVALI, NEMOD, IVALD, CMEANG, LNMNG, IRET)
This subroutine searches for a specified Table B mnemonic and associated value (code figure or bit nu...
Definition: getcfmng.f:108
function iupbs01(MBAY, S01MNEM)
This function returns a specified value from within Section 0 or Section 1 of a BUFR message...
Definition: iupbs01.f:72