30 use modv_vars,
only: iprt
34 integer,
intent(in) :: lunit, lun, lundx
35 integer lud, ildx, imdx
41 call status(lundx,lud,ildx,imdx)
45 if (lunit==lundx)
then
48 call errwrt(
'++++++++++++BUFR ARCHIVE LIBRARY+++++++++++++++')
49 write ( unit=errstr, fmt=
'(A,A,I3,A)' )
'BUFRLIB: READDX - READING BUFR DICTIONARY TABLE FROM ', &
50 'INPUT BUFR FILE IN UNIT ', lundx,
' INTO INTERNAL ARRAYS'
52 call errwrt(
'++++++++++++BUFR ARCHIVE LIBRARY+++++++++++++++')
60 call errwrt(
'++++++++++++BUFR ARCHIVE LIBRARY+++++++++++++++')
61 write ( unit=errstr, fmt=
'(A,A,I3,A,A,I3)' )
'BUFRLIB: READDX - COPYING BUFR DCTY TBL FROM INTERNAL ', &
62 'ARRAYS ASSOC. W/ INPUT UNIT ', lundx,
' TO THOSE ASSOC. W/ UNIT ', lunit
64 call errwrt(
'++++++++++++BUFR ARCHIVE LIBRARY+++++++++++++++')
72 call errwrt(
'++++++++++++BUFR ARCHIVE LIBRARY+++++++++++++++')
73 write ( unit=errstr, fmt=
'(A,A,I3,A,A,I3)' )
'BUFRLIB: READDX - COPYING BUFR DCTY TBL FROM INTERNAL ', &
74 'ARRAYS ASSOC. W/ OUTPUT UNIT ', lundx,
' TO THOSE ASSOC. W/ UNIT ', lunit
76 call errwrt(
'++++++++++++BUFR ARCHIVE LIBRARY+++++++++++++++')
84 call errwrt(
'++++++++++++BUFR ARCHIVE LIBRARY+++++++++++++++')
85 write ( unit=errstr, fmt=
'(A,A,I3,A)' )
'BUFRLIB: READDX - READING BUFR DICTIONARY TABLE FROM ', &
86 'USER-SUPPLIED TEXT FILE IN UNIT ', lundx,
' INTO INTERNAL ARRAYS'
88 call errwrt(
'++++++++++++BUFR ARCHIVE LIBRARY+++++++++++++++')
94 call bort(
'BUFRLIB: READDX - CANNOT DETERMINE SOURCE OF INPUT DICTIONARY TABLE')
124 use modv_vars,
only: iprt
130 integer,
intent(in) :: lunit, lun
131 integer ict, ier, idxmsg, iupbs3
144 do while ( .not. done )
146 if ( ier == -1 )
then
152 else if ( ier == -2 )
then
153 call bort(
'BUFRLIB: RDBFDX - ERROR READING A BUFR DICTIONARY MESSAGE')
154 else if ( idxmsg(
mgwa) /= 1 )
then
159 else if ( iupbs3(
mgwa,
'NSUB') == 0 )
then
170 if ( iprt >= 2 )
then
171 call errwrt(
'+++++++++++++++++++++++++++++++++++++++++++++++++')
172 write ( unit=errstr, fmt=
'(A,I3,A)' )
'BUFRLIB: RDBFDX - STORED NEW DX TABLE CONSISTING OF (', ict,
') MESSAGES;'
174 errstr =
'WILL APPLY THIS TABLE TO ALL SUBSEQUENT DATA IN FILE UNTIL NEXT DX TABLE IS FOUND'
176 call errwrt(
'+++++++++++++++++++++++++++++++++++++++++++++++++')
202 integer,
intent(in) :: lundx, lun
203 integer ios, iret, n, numbck, nemock, igetntbi
205 character*128 bort_str1
206 character*156 bort_str2
209 character*6 numb, nmb2
220 read(lundx,
'(A80)', iostat = ios) card
226 if(card(1: 1)==
'*') cycle
227 if(card(3:10)==
'--------') cycle
228 if(card(3:10)==
' ') cycle
229 if(card(3:10)==
'MNEMONIC') cycle
230 if(card(3:10)==
'TABLE D') cycle
231 if(card(3:10)==
'TABLE B') cycle
233 if(card(12:12)==
'|' .and. card(21:21)==
'|')
then
239 write(bort_str1,
'("BUFRLIB: RDUSDX - CARD READ IN IS: ",A)') card
240 write(bort_str2,
'(18X,"MNEMONIC ",A," IN USER DICTIONARY HAS INVALID CHARACTERS")') nemo
241 call bort2(bort_str1,bort_str2)
245 if(nmb2(1:1)==
'A') nmb2(1:1) =
'3'
248 write(bort_str1,
'("BUFRLIB: RDUSDX - CARD READ IN IS: ",A)') card
249 write(bort_str2,
'(18X,"DESCRIPTOR NUMBER ",A," IN USER '// &
250 'DICTIONARY HAS AN INVALID FIRST CHARACTER (F VALUE) - MUST BE A, 0 OR 3")') numb
251 call bort2(bort_str1,bort_str2)
254 write(bort_str1,
'("BUFRLIB: RDUSDX - CARD READ IN IS: ",A)') card
255 write(bort_str2,
'(18X,"DESCRIPTOR NUMBER ",A," IN USER '// &
256 'DICTIONARY HAS NON-NUMERIC VALUES IN CHARACTERS 2-6 (X AND Y VALUES)")') numb
257 call bort2(bort_str1,bort_str2)
260 write(bort_str1,
'("BUFRLIB: RDUSDX - CARD READ IN IS: ",A)') card
261 write(bort_str2,
'(18X,"DESCRIPTOR NUMBER ",A," IN USER '// &
262 'DICTIONARY HAS INVALID NUMBER IN CHARACTERS 2-3 (X VALUE) - MUST BE BETWEEN 00 AND 63")') numb
263 call bort2(bort_str1,bort_str2)
266 write(bort_str1,
'("BUFRLIB: RDUSDX - CARD READ IN IS: ",A)') card
267 write(bort_str2,
'(18X,"DESCRIPTOR NUMBER ",A," IN USER '// &
268 'DICTIONARY HAS INVALID NUMBER IN CHARACTERS 4-6 (Y VALUE) - MUST BE BETWEEN 000 AND 255")') numb
269 call bort2(bort_str1,bort_str2)
272 if(numb(1:1)==
'A')
then
274 n = igetntbi( lun,
'A' )
275 call stntbia ( n, lun, numb, nemo, card(23:) )
276 if (
idna(n,lun,1) == 11 )
then
277 write(bort_str1,
'("BUFRLIB: RDUSDX - CARD READ IN IS: ",A)') card
278 write(bort_str2,
'(18X,"USER-DEFINED MESSAGE TYPE ""011"" IS RESERVED FOR DICTIONARY MESSAGES")')
279 call bort2(bort_str1,bort_str2)
285 if(numb(1:1)==
'0')
then
287 call stntbi ( igetntbi(lun,
'B'), lun, numb, nemo, card(23:) )
291 if(numb(1:1)==
'3')
then
293 call stntbi ( igetntbi(lun,
'D'), lun, numb, nemo, card(23:) )
297 write(bort_str1,
'("BUFRLIB: RDUSDX - CARD READ IN IS: ",A)') card
298 write(bort_str2,
'(18X,"DESCRIPTOR NUMBER ",A," IN USER '// &
299 'DICTIONARY HAS AN INVALID FIRST CHARACTER (F VALUE) - MUST BE A, 0 OR 3")') numb
300 call bort2(bort_str1,bort_str2)
304 if(card(12:12)==
'|' .and. card(19:19)/=
'|')
then
310 if(card(12:12)==
'|' .and. card(19:19)==
'|')
then
317 write(bort_str1,
'("BUFRLIB: RDUSDX - CARD READ IN IS: ",A)') card
318 write(bort_str2,
'(18X,"THIS CARD HAS A BAD FORMAT - IT IS NOT RECOGNIZED BY THIS SUBROUTINE")')
319 call bort2(bort_str1,bort_str2)
334 use modv_vars,
only: reps, idnr
338 integer,
intent(in) :: lun
339 integer maxtgs, maxtag, ntag, idn, jdn, iseq, irep, i, j, n, itab, iret, ier, numr, nemock
341 character*128 bort_str1, bort_str2
343 character*80,
intent(in) :: card
344 character*12 atag, tags(250)
345 character*8 nemo, nema, nemb
346 character*6 adn30, clemon
363 call nemtab(lun,nemo,idn,tab,iseq)
365 write(bort_str1,
'("BUFRLIB: SEQSDX - CARD READ IN IS: ",A)') card
366 write(bort_str2,
'(18X,"MNEMONIC ",A," IS NOT A TABLE D ENTRY (UNDEFINED, TAB=",A,")")') nemo,tab
367 call bort2(bort_str1,bort_str2)
369 call parstr(seqs,tags,maxtgs,ntag,
' ',.true.)
371 write(bort_str1,
'("BUFRLIB: SEQSDX - CARD READ IN IS: ",A)') card
372 write(bort_str2,
'(18X,"TABLE D SEQUENCE (PARENT) MNEMONIC ",A," DOES NOT CONTAIN ANY CHILD MNEMONICS")') nemo
373 call bort2(bort_str1,bort_str2)
383 if(atag(1:1)==reps(i))
then
388 if(atag(j:j)==reps(i+5))
then
393 call strnum(atag(j+1:maxtag),numr,ier)
394 if(i==1 .and. numr<=0)
then
395 write(bort_str1,
'("BUFRLIB: SEQSDX - CARD READ IN IS: ",A)') card
396 write(bort_str2,
'(9X,"TBL D MNEM. ",A," CONTAINS REG. REPL. '// &
397 'CHILD MNEM. ",A," W/ INVALID # OF REPLICATIONS (",I3,") AFTER 2ND QUOTE")') nemo,tags(n),numr
398 call bort2(bort_str1,bort_str2)
400 if(i==1 .and. numr>255)
then
401 write(bort_str1,
'("BUFRLIB: SEQSDX - CARD READ IN IS: ",A)') card
402 write(bort_str2,
'(18X,"TBL D MNEM. ",A," CONTAINS REG. REPL. '// &
403 'CHILD MNEM. ",A," W/ # OF REPLICATIONS (",I3,") > LIMIT OF 255")') nemo,tags(n),numr
404 call bort2(bort_str1,bort_str2)
406 if(i/=1 .and. numr/=0)
then
407 write(bort_str1,
'("BUFRLIB: SEQSDX - CARD READ IN IS: ",A)') card
408 write(bort_str2,
'(18X,"TBL D MNEM. ",A," CONTAINS DELAYED REPL. '// &
409 'CHILD MNEM. ",A," W/ # OF REPL. (",I3,") SPECIFIED - A NO-NO")') nemo,tags(n),numr
410 call bort2(bort_str1,bort_str2)
417 write(bort_str1,
'("BUFRLIB: SEQSDX - CARD READ IN IS: ",A)') card
418 write(bort_str2,
'(18X,"TABLE D SEQUENCE (PARENT) MNEMONIC ",A,'// &
419 '" CONTAINS A BADLY FORMED CHILD MNEMONIC ",A)') nemo,tags(n)
420 call bort2(bort_str1,bort_str2)
428 write(bort_str1,
'("BUFRLIB: SEQSDX - CARD READ IN IS: ",A)') card
429 write(bort_str2,
'(18X,"TABLE D (PARENT) MNEMONIC ",A," CONTAINS'// &
430 ' A CHILD MNEMONIC ",A," NOT BETWEEN 1 & 8 CHARACTERS")') nemo,tags(n)
431 call bort2(bort_str1,bort_str2)
434 write(bort_str1,
'("BUFRLIB: SEQSDX - CARD READ IN IS: ",A)') card
435 write(bort_str2,
'(18X,"TABLE D (PARENT) MNEMONIC ",A," CONTAINS'// &
436 ' A CHILD MNEMONIC ",A," WITH INVALID CHARACTERS")') nemo,tags(n)
437 call bort2(bort_str1,bort_str2)
439 call nemtab(lun,atag,idn,tab,iret)
444 if(tab==
'B' .and. irep/=0)
then
445 write(bort_str1,
'("BUFRLIB: SEQSDX - CARD READ IN IS: ",A)') card
446 write(bort_str2,
'(18X,"TABLE D (PARENT) MNEMONIC ",A," CONTAINS'// &
447 ' A REPLICATED CHILD TABLE B MNEMONIC ",A," - A NO-NO")') nemo,tags(n)
448 call bort2(bort_str1,bort_str2)
450 if(atag(1:1)==
'.')
then
455 write(bort_str1,
'("BUFRLIB: SEQSDX - CARD READ IN IS: ",A)') card
456 write(bort_str2,
'(18X,"TBL D (PARENT) MNEM. ",A," CONTAINS A '// &
457 '''FOLLOWING VALUE'' MNEMONIC WHICH IS LAST IN THE STRING")') nemo
458 call bort2(bort_str1,bort_str2)
460 nemb = tags(n+1)(1:8)
461 call numtab(lun,idn,nema,tab,itab)
462 call nemtab(lun,nemb,jdn,tab,iret)
465 write(bort_str1,
'("BUFRLIB: SEQSDX - CARD READ IN IS: ",A)') card
466 write(bort_str2,
'(18X,"TBL D (PARENT) MNEM. ",A," CONTAINS AN '// &
467 'INVALID ''FOLLOWING VALUE'' MNEMONIC ",A,"(SHOULD BE ",A,")")') nemo,tags(n),nema
468 call bort2(bort_str1,bort_str2)
471 write(bort_str1,
'("BUFRLIB: SEQSDX - CARD READ IN IS: ",A)') card
472 write(bort_str2,
'(18X,"TBL D (PARENT) MNEM. ",A,", THE MNEM. ",'// &
473 'A," FOLLOWING A ''FOLLOWING VALUE'' MNEM. IS NOT A TBL B ENTRY")') nemo,nemb
474 call bort2(bort_str1,bort_str2)
478 write(bort_str1,
'("BUFRLIB: SEQSDX - CARD READ IN IS: ",A)') card
479 write(bort_str2,
'(18X,"TABLE D SEQUENCE (PARENT) MNEMONIC ",A,'// &
480 '" CONTAINS A CHILD MNEMONIC ",A," NOT FOUND IN ANY TABLE")') nemo,tags(n)
481 call bort2(bort_str1,bort_str2)
485 if(irep>0)
call pktdd(iseq,lun,idnr(irep)+numr,iret)
487 clemon = adn30(idnr(irep)+numr,6)
488 write(bort_str1,
'("BUFRLIB: SEQSDX - CARD READ IN IS: ",A)') card
489 write(bort_str2,
'(9X,"TBL D (PARENT) MNEM. ",A," - BAD RETURN '// &
490 'FROM PKTDD TRYING TO STORE REPL. DESC. ",A,", SEE PREV. WARNING MSG")') nemo,clemon
491 call bort2(bort_str1,bort_str2)
493 call pktdd(iseq,lun,idn,iret)
495 write(bort_str1,
'("BUFRLIB: SEQSDX - CARD READ IN IS: ",A)') card
496 write(bort_str2,
'(9X,"TBL D (PARENT) MNEM. ",A," - BAD RETURN '// &
497 'FROM PKTDD TRYING TO STORE CHILD MNEM. ",A,", SEE PREV. WARNING MSG")') nemo,tags(n)
498 call bort2(bort_str1,bort_str2)
521 integer,
intent(in) :: lun
522 integer idsn, iele, iret
524 character*128 bort_str1, bort_str2
525 character*80,
intent(in) :: card
527 character*11 refr, refr_orig
529 character*4 scal, scal_orig
530 character*3 bitw, bitw_orig
547 call nemtab(lun,nemo,idsn,tab,iele)
549 write(bort_str1,
'("BUFRLIB: ELEMDX - CARD READ IN IS: ",A)') card
550 write(bort_str2,
'(18X,"MNEMONIC ",A," IS NOT A TABLE B ENTRY (UNDEFINED, TAB=",A,")")') nemo,tab
551 call bort2(bort_str1,bort_str2)
558 write(bort_str1,
'("BUFRLIB: ELEMDX - CARD READ IN IS: ",A)') card
559 write(bort_str2,
'(18X,"UNITS FIELD IS EMPTY")')
560 call bort2(bort_str1,bort_str2)
562 tabb(iele,lun)(71:94) = unit
565 call jstnum(scal,sign,iret)
567 write(bort_str1,
'("BUFRLIB: ELEMDX - CARD READ IN IS: ",A)') card
568 write(bort_str2,
'(18X,"PARSED SCALE VALUE (=",A,") IS NOT NUMERIC")') scal_orig
569 call bort2(bort_str1,bort_str2)
571 tabb(iele,lun)(95:95) = sign
572 tabb(iele,lun)(96:98) = scal(1:3)
575 call jstnum(refr,sign,iret)
577 write(bort_str1,
'("BUFRLIB: ELEMDX - CARD READ IN IS: ",A)') card
578 write(bort_str2,
'(18X,"PARSED REFERENCE VALUE (=",A,") IS NOT NUMERIC")') refr_orig
579 call bort2(bort_str1,bort_str2)
581 tabb(iele,lun)( 99: 99) = sign
582 tabb(iele,lun)(100:109) = refr(1:10)
585 call jstnum(bitw,sign,iret)
586 if(iret/=0 .or. sign==
'-')
then
587 write(bort_str1,
'("BUFRLIB: ELEMDX - CARD READ IN IS: ",A)') card
588 write(bort_str2,
'(18X,"PARSED BIT WIDTH VALUE (=",A,") IS NOT NUMERIC")') bitw_orig
589 call bort2(bort_str1,bort_str2)
591 tabb(iele,lun)(110:112) = bitw
607 use modv_vars,
only: idnr, fxy_fbit, fxy_sbyct, fxy_drf16, fxy_drf8, fxy_drf1
613 integer,
intent(in) :: lun, ioi
614 integer ninib, ninid, n, i, iret, ifxy
616 character*8 inib(6,5),inid(5)
619 data inib /
'------',
'BYTCNT ',
'BYTES ',
'+0',
'+0',
'16', &
620 '------',
'BITPAD ',
'NONE ',
'+0',
'+0',
'1 ', &
621 fxy_drf1,
'DRF1BIT ',
'NUMERIC',
'+0',
'+0',
'1 ', &
622 fxy_drf8,
'DRF8BIT ',
'NUMERIC',
'+0',
'+0',
'8 ', &
623 fxy_drf16,
'DRF16BIT',
'NUMERIC',
'+0',
'+0',
'16'/
647 call pktdd(i,lun,0,iret)
654 inib(1,1) = fxy_sbyct
659 idnb(i,lun) = ifxy(inib(1,i))
660 tabb(i,lun)( 1: 6) = inib(1,i)(1:6)
661 tabb(i,lun)( 7: 70) = inib(2,i)
662 tabb(i,lun)( 71: 94) = inib(3,i)
663 tabb(i,lun)( 95: 98) = inib(4,i)(1:4)
664 tabb(i,lun)( 99:109) = inib(5,i)
665 tabb(i,lun)(110:112) = inib(6,i)(1:3)
670 idnd(n,lun) = idnr(i)
671 tabd(n,lun)(1: 6) = adn30(idnr(i),6)
672 tabd(n,lun)(7:70) = inid(i)
673 call pktdd(n,lun,idnr(1),iret)
674 call pktdd(n,lun,idnr(i+5),iret)
692 subroutine dxmini(mbay,mbyt,mb4,mba,mbb,mbd)
694 use modv_vars,
only: mxmsgld4, mtv, nby0, nby1, nby2, nby5, bmostr, idxv
698 integer,
intent(out) :: mbay(*), mbyt, mb4, mba, mbb, mbd
699 integer nxstr, ldxa, ldxb, ldxd, ld30, mtyp, msbt, mbit, ih, id, im, iy, i, nsub, idxs, ldxs, &
702 character*128 bort_str
705 common /dxtab/ nxstr(10), ldxa(10), ldxb(10), ldxd(10), ld30(10), dxstr(10)
727 len3 = 7 + nxstr(idxs) + 1
729 mbyt = nby0+nby1+nby2+len3+nby4+nby5
731 if(mod(len3,2)/=0)
call bort (
'BUFRLIB: DXMINI - LENGTH OF SECTION 3 IS NOT A MULTIPLE OF 2')
735 call pkc(bmostr , 4 , mbay,mbit)
736 call pkb( mbyt , 24 , mbay,mbit)
737 call pkb( 3 , 8 , mbay,mbit)
741 call pkb( nby1 , 24 , mbay,mbit)
742 call pkb( 0 , 8 , mbay,mbit)
743 call pkb( 3 , 8 , mbay,mbit)
744 call pkb( 7 , 8 , mbay,mbit)
745 call pkb( 0 , 8 , mbay,mbit)
746 call pkb( 0 , 8 , mbay,mbit)
747 call pkb( mtyp , 8 , mbay,mbit)
748 call pkb( msbt , 8 , mbay,mbit)
749 call pkb( mtv , 8 , mbay,mbit)
750 call pkb( idxv , 8 , mbay,mbit)
751 call pkb( iy , 8 , mbay,mbit)
752 call pkb( im , 8 , mbay,mbit)
753 call pkb( id , 8 , mbay,mbit)
754 call pkb( ih , 8 , mbay,mbit)
755 call pkb( 0 , 8 , mbay,mbit)
756 call pkb( 0 , 8 , mbay,mbit)
760 call pkb( len3 , 24 , mbay,mbit)
761 call pkb( 0 , 8 , mbay,mbit)
762 call pkb( 1 , 16 , mbay,mbit)
763 call pkb( 2**7 , 8 , mbay,mbit)
765 call pkb(iupm(dxstr(idxs)(i:i),8),8,mbay,mbit)
767 call pkb( 0 , 8 , mbay,mbit)
772 call pkb( nby4 , 24 , mbay,mbit)
773 call pkb( 0 , 8 , mbay,mbit)
775 call pkb( 0 , 8 , mbay,mbit)
777 call pkb( 0 , 8 , mbay,mbit)
779 call pkb( 0 , 8 , mbay,mbit)
781 if(mbit/8+nby5/=mbyt)
then
782 write(bort_str,
'("BUFRLIB: DXMINI - NUMBER OF BYTES STORED FOR '// &
783 'A MESSAGE (",I6,") IS NOT THE SAME AS FIRST CALCULATED, MBYT (",I6)') mbit/8+nby5,mbyt
805 integer,
intent(in) :: lunit, lun, lundx
807 character*128 bort_str
811 if(lunit==lundx)
then
812 write(bort_str,
'("BUFRLIB: WRITDX - FILES CONTAINING BUFR DATA '// &
813 'AND DICTIONARY TABLE CANNOT BE THE SAME (HERE BOTH SHARE FORTRAN UNIT NUMBER ",I3,")")') lunit
819 call readdx(lunit,lun,lundx)
841 use modv_vars,
only: im8b, idxv
849 integer,
intent(in) :: lundx, lunot
850 integer nxstr, ldxa, ldxb, ldxd, ld30, my_lundx, my_lunot, ldx, lot, il, im, lda, ldb, ldd, l30, nseq, &
851 mbit, mbyt, mby4, mbya, mbyb, mbyd, i, j, jj, idn, lend, len0, len1, len2, l3, l4, l5,
iupb,
iupm
853 common /dxtab/ nxstr(10), ldxa(10), ldxb(10), ldxd(10), ld30(10), dxstr(10)
865 call x84(lundx,my_lundx,1)
866 call x84(lunot,my_lunot,1)
867 call wrdxtb(my_lundx,my_lunot)
875 call status(lunot,lot,il,im)
876 if(il==0)
call bort(
'BUFRLIB: WRDXTB - OUTPUT BUFR FILE IS CLOSED, IT MUST BE OPEN FOR OUTPUT')
877 if(il<0)
call bort(
'BUFRLIB: WRDXTB - OUTPUT BUFR FILE IS OPEN FOR INPUT, IT MUST BE OPEN FOR OUTPUT')
879 call status(lundx,ldx,il,im)
880 if(il==0)
call bort(
'BUFRLIB: WRDXTB - DX TABLE FILE IS CLOSED, IT MUST BE OPEN')
884 if(lundx/=lunot)
call cpbfdx(ldx,lot)
936 nseq =
iupm(
tabd(i,lot)(ldd+1:ldd+1),8)
937 lend = ldd+1 + l30*nseq
967 mbit = (len0+len1+len2+4)*8
982 use modv_vars,
only: maxcd, idxv
988 integer,
intent(in) :: lun, mesg(*)
989 integer nxstr, ldxa, ldxb, ldxd, ld30, ldxbd(10), ldxbe(10), ja, jb, idxs, i3, i, j, n, nd, ndd, idn, &
990 jbit, len0, len1, len2, len3, l4, l5, lda, ldb, ldd, ldbd, ldbe, l30, ia, la, ib, lb, id, ld, iret, &
991 ifxy, iupb, iupbs01, igetntbi, idn30
993 character*128 bort_str
994 character*128 tabb1, tabb2
1000 character*6 numb, cidn
1002 common /dxtab/ nxstr(10), ldxa(10), ldxb(10), ldxd(10), ld30(10), dxstr(10)
1004 data ldxbd /38, 70, 8*0/
1005 data ldxbe /42, 42, 8*0/
1008 ja(i) = ia+1+lda*(i-1)
1009 jb(i) = ib+1+ldb*(i-1)
1013 idxs = iupbs01(mesg,
'MSBT')+1
1014 if(idxs>idxv+1) idxs = iupbs01(mesg,
'MTVL')+1
1015 if(ldxa(idxs)==0 .or. ldxb(idxs)==0 .or. ldxd(idxs)==0)
call bort(
'BUFRLIB: STBFDX - UNEXPECTED DICTIONARY '// &
1016 'MESSAGE SUBTYPE OR LOCAL VERSION NUMBER (E.G., L.V.N. HIGHER THAN KNOWN)')
1018 call getlens(mesg,3,len0,len1,len2,len3,l4,l5)
1022 call upc(dxcmp,nxstr(idxs),mesg,jbit,.false.)
1023 if(dxcmp/=dxstr(idxs))
call bort(
'BUFRLIB: STBFDX - UNEXPECTED DICTIONARY MESSAGE CONTENTS')
1035 la = iupb(mesg,ia,8)
1037 lb = iupb(mesg,ib,8)
1039 ld = iupb(mesg,id,8)
1044 n = igetntbi(lun,
'A')
1046 call upc(
taba(n,lun),lda,mesg,jbit,.true.)
1047 numb =
' '//
taba(n,lun)(1:3)
1048 nemo =
taba(n,lun)(4:11)
1049 cseq =
taba(n,lun)(13:67)
1050 call stntbia(n,lun,numb,nemo,cseq)
1056 n = igetntbi(lun,
'B')
1058 call upc(tabb1,ldbd,mesg,jbit,.true.)
1059 jbit = 8*(jb(i)+ldbd-1)
1060 call upc(tabb2,ldbe,mesg,jbit,.true.)
1061 tabb(n,lun) = tabb1(1:ldxbd(idxv+1))//tabb2(1:ldxbe(idxv+1))
1062 numb =
tabb(n,lun)(1:6)
1063 nemo =
tabb(n,lun)(7:14)
1064 call nenubd(nemo,numb,lun)
1065 idnb(n,lun) = ifxy(numb)
1066 unit =
tabb(n,lun)(71:94)
1068 tabb(n,lun)(71:94) = unit
1075 n = igetntbi(lun,
'D')
1077 call upc(
tabd(n,lun),ldd,mesg,jbit,.true.)
1078 numb =
tabd(n,lun)(1:6)
1079 nemo =
tabd(n,lun)(7:14)
1080 call nenubd(nemo,numb,lun)
1081 idnd(n,lun) = ifxy(numb)
1082 nd = iupb(mesg,id+ldd+1,8)
1084 write(bort_str,
'("BUFRLIB: STBFDX - NUMBER OF DESCRIPTORS IN '// &
1085 'TABLE D ENTRY ",A," IN BUFR TABLE (",I4,") EXCEEDS THE LIMIT (",I4,")")') nemo,nd,maxcd
1089 ndd = id+ldd+2 + (j-1)*l30
1091 call upc(cidn,l30,mesg,jbit,.true.)
1092 idn = idn30(cidn,l30)
1093 call pktdd(n,lun,idn,iret)
1094 if(iret<0)
call bort(
'BUFRLIB: STBFDX - BAD RETURN FROM BUFRLIB ROUTINE PKTDD, SEE PREVIOUS WARNING MESSAGE')
1096 id = id+ldd+1 + nd*l30
1097 if(iupb(mesg,id+1,8)==0) id = id+1
1113 integer function idxmsg( mesg )
result( iret )
1117 integer,
intent(in) :: mesg(*)
1123 if ( (
iupbs01(mesg,
'MTYP')==11) .and. &
1149 integer,
intent(in) :: lun
1152 character,
intent(in) :: ctb
1153 character*128 bort_str
1155 if ( ctb ==
'A' )
then
1156 iret =
ntba(lun) + 1
1158 else if ( ctb ==
'B' )
then
1159 iret =
ntbb(lun) + 1
1162 iret =
ntbd(lun) + 1
1165 if ( iret > imax )
then
1166 write(bort_str,
'("BUFRLIB: IGETNTBI - NUMBER OF INTERNAL TABLE",A1," ENTRIES EXCEEDS THE LIMIT (",I4,")")') ctb, imax
1193 integer,
intent(in) :: lun
1194 integer,
intent(out) :: mtyp, msbt, inod
1197 character*(*),
intent(in) :: nemo
1198 character*128 bort_str
1205 if(
taba(i,lun)(4:11)==nemo)
then
1206 mtyp =
idna(i,lun,1)
1207 msbt =
idna(i,lun,2)
1209 if(mtyp<0 .or. mtyp>255)
then
1210 write(bort_str,
'("BUFRLIB: NEMTBAX - INVALID MESSAGE TYPE (",I4,") RETURNED FOR MENMONIC ",A)') mtyp, nemo
1213 if(msbt<0 .or. msbt>255)
then
1214 write(bort_str,
'("BUFRLIB: NEMTBAX - INVALID MESSAGE SUBTYPE (",I4,") RETURNED FOR MENMONIC ",A)') msbt, nemo
1241 integer,
intent(in) :: lun
1242 integer,
intent(out) :: mtyp, msbt, inod
1244 character*(*),
intent(in) :: nemo
1245 character*128 bort_str
1249 call nemtbax(lun,nemo,mtyp,msbt,inod)
1251 write(bort_str,
'("BUFRLIB: NEMTBA - CAN''T FIND MNEMONIC ",A)') nemo
1268 subroutine nemtbb(lun,itab,unit,iscl,iref,ibit)
1274 integer,
intent(in) :: lun, itab
1275 integer,
intent(out) :: iscl, iref, ibit
1278 character*128 bort_str
1279 character*24,
intent(out) :: unit
1282 if(itab<=0 .or. itab>
ntbb(lun))
then
1283 write(bort_str,
'("BUFRLIB: NEMTBB - ITAB (",I7,") NOT FOUND IN TABLE B")') itab
1289 idn =
idnb(itab,lun)
1290 nemo =
tabb(itab,lun)( 7:14)
1291 unit =
tabb(itab,lun)(71:94)
1292 call strnum(
tabb(itab,lun)( 95: 98),iscl,ierns)
1293 call strnum(
tabb(itab,lun)( 99:109),iref,ierns)
1294 call strnum(
tabb(itab,lun)(110:112),ibit,ierns)
1298 if(unit(1:5)/=
'CCITT' .and. ibit>32)
then
1299 write(bort_str,
'("BUFRLIB: NEMTBB - BIT WIDTH FOR NON-CHARACTER TABLE B MNEMONIC ",A," (",I7,") IS > 32")') nemo,ibit
1302 if(unit(1:5)==
'CCITT' .and. mod(ibit,8)/=0)
then
1303 write(bort_str,
'("BUFRLIB: NEMTBB - BIT WIDTH FOR CHARACTER TABLE B MNEMONIC ",A," (",I7,") IS NOT A MULTIPLE OF 8")') &
1336 subroutine nemtbd(lun,itab,nseq,nems,irps,knts)
1338 use modv_vars,
only: maxcd
1344 integer,
intent(in) :: lun, itab
1345 integer,
intent(out) :: nseq, irps(*), knts(*)
1346 integer i, j, ndsc, idsc, iret
1348 character*128 bort_str
1349 character*8,
intent(out) :: nems(*)
1350 character*8 nemo, nemt, nemf
1353 if(itab<=0 .or. itab>
ntbd(lun))
then
1354 write(bort_str,
'("BUFRLIB: NEMTBD - ITAB (",I7,") NOT FOUND IN TABLE D")') itab
1370 nemo =
tabd(itab,lun)(7:14)
1371 idsc =
idnd(itab,lun)
1372 call uptdd(itab,lun,0,ndsc)
1377 if(nseq+1>maxcd)
then
1378 write(bort_str,
'("BUFRLIB: NEMTBD - THERE ARE MORE THAN '// &
1379 '(",I4,") DESCRIPTORS (THE LIMIT) IN TABLE D SEQUENCE MNEMONIC ",A)') maxcd, nemo
1382 call uptdd(itab,lun,j,idsc)
1383 call numtab(lun,idsc,nemt,tab,iret)
1388 knts(nseq+1) = abs(iret)
1393 elseif(tab==
'F')
then
1396 elseif(tab==
'D'.or.tab==
'C')
then
1399 elseif(tab==
'B')
then
1401 if((nemt(1:1)==
'.').and.(j<ndsc))
then
1403 call uptdd(itab,lun,j+1,idsc)
1404 call numtab(lun,idsc,nemf,tab,iret)
1436 recursive subroutine nemdefs ( lunit, nemo, celem, cunit, iret )
1438 use modv_vars,
only: im8b
1444 integer,
intent(in) :: lunit
1445 integer,
intent(out) :: iret
1446 integer my_lunit, lun, il, im, idn, iloc, ls
1448 character*(*),
intent(in) :: nemo
1449 character*(*),
intent(out) :: celem, cunit
1456 call x84 ( lunit, my_lunit, 1 )
1457 call nemdefs ( my_lunit, nemo, celem, cunit, iret )
1458 call x48 ( iret, iret, 1 )
1467 call status( lunit, lun, il, im )
1468 if ( il == 0 )
return
1472 call nemtab( lun, nemo, idn, tab, iloc )
1473 if ( ( iloc == 0 ) .or. ( tab /=
'B' ) )
return
1478 ls = min(len(celem),55)
1479 celem(1:ls) =
tabb(iloc,lun)(16:15+ls)
1482 ls = min(len(cunit),24)
1483 cunit(1:ls) =
tabb(iloc,lun)(71:70+ls)
1510 character,
intent(in) :: nemo*8, numb*6
1511 character*128 bort_str
1513 integer,
intent(in) :: lun
1517 if(numb==
tabb(n,lun)(1:6))
then
1518 write(bort_str,
'("BUFRLIB: NENUBD - TABLE B FXY VALUE (",A,") HAS ALREADY BEEN DEFINED (DUPLICATE)")') numb
1521 if(nemo==
tabb(n,lun)(7:14))
then
1522 write(bort_str,
'("BUFRLIB: NENUBD - TABLE B MNEMONIC (",A,") HAS ALREADY BEEN DEFINED (DUPLICATE)")') nemo
1528 if(numb==
tabd(n,lun)(1:6))
then
1529 write(bort_str,
'("BUFRLIB: NENUBD - TABLE D FXY VALUE (",A,") HAS ALREADY BEEN DEFINED (DUPLICATE)")') numb
1532 if(nemo==
tabd(n,lun)(7:14))
then
1533 write(bort_str,
'("BUFRLIB: NENUBD - TABLE D MNEMONIC (",A,") HAS ALREADY BEEN DEFINED (DUPLICATE)")') nemo
1556 integer,
intent(in) :: n, lun
1557 integer i, mtyp, msbt
1559 character*(*),
intent(in) :: numb, nemo, celsq
1560 character*128 bort_str
1565 if(numb(4:6)==
taba(i,lun)(1:3))
then
1566 write(bort_str,
'("BUFRLIB: STNTBIA - TABLE A FXY VALUE (",A,") HAS ALREADY BEEN DEFINED (DUPLICATE)")') numb
1569 if(nemo(1:8)==
taba(i,lun)(4:11))
then
1570 write(bort_str,
'("BUFRLIB: STNTBIA - TABLE A MNEMONIC (",A,") HAS ALREADY BEEN DEFINED (DUPLICATE)")') nemo
1577 taba(n,lun)(1:3) = numb(4:6)
1578 taba(n,lun)(4:11) = nemo(1:8)
1579 taba(n,lun)(13:67) = celsq(1:55)
1583 if ( verify( nemo(3:8),
'1234567890' ) == 0 )
then
1585 read ( nemo,
'(2X,2I3)') mtyp, msbt
1586 idna(n,lun,1) = mtyp
1587 idna(n,lun,2) = msbt
1590 read ( numb(4:6),
'(I3)')
idna(n,lun,1)
1611 subroutine stntbi ( n, lun, numb, nemo, celsq )
1617 integer,
intent(in) :: n, lun
1620 character*(*),
intent(in) :: numb, nemo, celsq
1622 call nenubd ( nemo, numb, lun )
1624 if ( numb(1:1) ==
'0')
then
1625 idnb(n,lun) = ifxy(numb)
1626 tabb(n,lun)(1:6) = numb(1:6)
1627 tabb(n,lun)(7:14) = nemo(1:8)
1628 tabb(n,lun)(16:70) = celsq(1:55)
1631 idnd(n,lun) = ifxy(numb)
1632 tabd(n,lun)(1:6) = numb(1:6)
1633 tabd(n,lun)(7:14) = nemo(1:8)
1634 tabd(n,lun)(16:70) = celsq(1:55)
1658 use modv_vars,
only: maxcd, iprt, idxv
1664 integer,
intent(in) :: id, lun, idn
1665 integer,
intent(out) :: iret
1666 integer nxstr, ldxa, ldxb, ldxd, ld30, ldd, nd, idm, iupm
1668 character*128 errstr
1671 common /dxtab/ nxstr(10), ldxa(10), ldxb(10), ldxd(10), ld30(10), dxstr(10)
1675 ldd = ldxd(idxv+1)+1
1679 call ipkm(
tabd(id,lun)(ldd:ldd),1,0)
1686 nd = iupm(
tabd(id,lun)(ldd:ldd),8)
1688 if(nd<0 .or. nd==maxcd)
then
1690 call errwrt(
'+++++++++++++++++++++WARNING+++++++++++++++++++++++')
1692 write ( unit=errstr, fmt=
'(A,I4,A)' )
'BUFRLIB: PKTDD - BAD COUNTER VALUE (=', nd,
') - RETURN WITH IRET = -1'
1694 write ( unit=errstr, fmt=
'(A,I4,A,A)' )
'BUFRLIB: PKTDD - MAXIMUM NUMBER OF CHILD MNEMONICS (=', &
1695 maxcd,
') ALREADY STORED FOR THIS PARENT - RETURN WITH IRET = -1'
1698 call errwrt(
'+++++++++++++++++++++WARNING+++++++++++++++++++++++')
1705 call ipkm(
tabd(id,lun)(ldd:ldd),1,nd)
1711 idm = ldd+1 + (nd-1)*2
1712 call ipkm(
tabd(id,lun)(idm:idm),2,idn)
1715 end subroutine pktdd
1732 use modv_vars,
only: idxv
1738 integer,
intent(in) :: id, lun, ient
1739 integer,
intent(out) :: iret
1740 integer nxstr, ldxa, ldxb, ldxd, ld30, ldd, ndsc, idsc, iupm
1742 character*128 bort_str
1745 common /dxtab/ nxstr(10), ldxa(10), ldxb(10), ldxd(10), ld30(10), dxstr(10)
1749 ldd = ldxd(idxv+1)+1
1750 ndsc = iupm(
tabd(id,lun)(ldd:ldd),8)
1754 elseif(ient<0 .or. ient>ndsc)
then
1755 write(bort_str,
'("BUFRLIB: UPTDD - VALUE OF THIRD ARGUMENT IENT (INPUT) IS OUT OF RANGE (IENT =",I4,")")') ient
1761 idsc = ldd+1 + (ient-1)*2
1762 iret = iupm(
tabd(id,lun)(idsc:idsc),16)
1765 end subroutine uptdd
1790 character*8,
intent(inout) :: nem1
1791 character*8,
intent(in) :: nem2
1800 if(nem1(i:i)==
'.')
then
1801 nem1(i:i) = nem2(j:j)
subroutine bort(str)
Log an error message, then abort the application program.
subroutine bort2(str1, str2)
Log two error messages, then abort the application program.
recursive integer function iupb(mbay, nbyt, nbit)
Decode an integer value from within a specified number of bits of an integer array,...
recursive integer function iupm(cbay, nbits)
Decode an integer value from within a specified number of bits of a character string,...
subroutine upc(chr, nchr, ibay, ibit, cnvnull)
Decode a character string from within a specified number of bytes of an integer array,...
subroutine pkc(chr, nchr, ibay, ibit)
Encode a character string within a specified number of bytes of an integer array, starting at the bit...
recursive subroutine ipkm(cbay, nbyt, n)
Encode an integer value within a specified number of bytes of a character string, up to a maximum of ...
subroutine pkb(nval, nbits, ibay, ibit)
Encode an integer value within a specified number of bits of an integer array, starting at the bit im...
subroutine cpbfdx(lud, lun)
Copy all of the DX BUFR table information from one unit to another within internal memory.
subroutine elemdx(card, lun)
Decode the scale factor, reference value, bit width and units (i.e., the "elements") from a Table B m...
subroutine nemtbb(lun, itab, unit, iscl, iref, ibit)
Get information about a Table B descriptor from the internal DX BUFR tables.
subroutine dxmini(mbay, mbyt, mb4, mba, mbb, mbd)
Initialize a DX BUFR tables (dictionary) message, writing all the preliminary information into Sectio...
subroutine nemtba(lun, nemo, mtyp, msbt, inod)
Get information about a Table A descriptor from the internal DX BUFR tables.
subroutine rdusdx(lundx, lun)
Read and parse a file containing a user-supplied DX BUFR table in character format,...
subroutine rsvfvm(nem1, nem2)
Process a "following value" mnemonic.
subroutine seqsdx(card, lun)
Decode the Table D sequence information from a mnemonic definition card that was previously read from...
recursive subroutine wrdxtb(lundx, lunot)
Generate one or more BUFR messages from the DX BUFR tables information associated with a given BUFR f...
subroutine nemtbax(lun, nemo, mtyp, msbt, inod)
Get information about a Table A descriptor from the internal DX BUFR tables.
subroutine nemtbd(lun, itab, nseq, nems, irps, knts)
Get information about a Table D descriptor from the internal DX BUFR tables.
subroutine stntbi(n, lun, numb, nemo, celsq)
Store a new entry within internal BUFR Table B or D.
subroutine pktdd(id, lun, idn, iret)
Store information about a child mnemonic within the internal BUFR Table D.
subroutine stntbia(n, lun, numb, nemo, celsq)
Store a new entry within internal BUFR Table A.
subroutine stbfdx(lun, mesg)
Copy a DX BUFR tables message into the internal memory arrays in module moda_tababd.
subroutine writdx(lunit, lun, lundx)
Write DX BUFR table (dictionary) messages to the beginning of an output BUFR file in lunit.
recursive subroutine nemdefs(lunit, nemo, celem, cunit, iret)
Get the element name and units associated with a Table B descriptor.
integer function igetntbi(lun, ctb)
Get the next available index for storing an entry within a specified internal DX BUFR table.
subroutine readdx(lunit, lun, lundx)
Initialize modules moda_tababd and moda_msgcwd with DX BUFR (dictionary) tables.
subroutine dxinit(lun, ioi)
Clear out the internal arrays (in module moda_tababd) holding the DX BUFR table, then optionally init...
subroutine nenubd(nemo, numb, lun)
Confirm that a mnemonic and FXY value haven't already been defined.
integer function idxmsg(mesg)
Check whether a BUFR message contains DX BUFR tables information that was generated by the NCEPLIBS-b...
subroutine uptdd(id, lun, ient, iret)
Get the WMO bit-wise representation of the FXY value corresponding to a child mnemonic in a Table D s...
subroutine rdbfdx(lunit, lun)
Beginning at the current file pointer location within lunit, read a complete DX BUFR table into inter...
subroutine errwrt(str)
Specify a custom location for the logging of error and diagnostic messages generated by the NCEPLIBS-...
subroutine nemtab(lun, nemo, idn, tab, iret)
Get information about a descriptor, based on a mnemonic.
subroutine numtab(lun, idn, nemo, tab, iret)
Get information about a descriptor, based on the WMO bit-wise representation of an FXY value.
character *(*) function adn30(idn, ldn)
Convert an FXY value from its WMO bit-wise representation to a character string of length 5 or 6.
subroutine makestab
Build the entire internal jump/link table within module moda_tables, using all of the internal BUFR t...
subroutine jstnum(str, sign, iret)
Left-justify a character string containing an encoded integer, by removing all leading blanks and any...
recursive subroutine strnum(str, num, iret)
Decode an integer from a character string.
subroutine capit(str)
Capitalize all of the alphabetic characters in a string.
Wrap C NCEPLIBS-bufr functions so they can be called from within the Fortran part of the library.
Declare arrays and variables used to store BUFR messages internally for multiple file IDs.
integer maxbyt
Maximum length of an output BUFR message.
Declare an array used by various subroutines and functions to hold a temporary working copy of a BUFR...
integer, dimension(:), allocatable mgwa
Temporary working copy of BUFR message.
Declare arrays and variables used to store DX BUFR tables internally for multiple file IDs.
integer, dimension(:), allocatable ntba
Number of Table A entries for each file ID (up to a maximum of maxtba, whose value is stored in array...
character *600, dimension(:,:), allocatable tabd
Table D entries for each file ID.
character *128, dimension(:,:), allocatable taba
Table A entries for each file ID.
integer, dimension(:,:), allocatable mtab
Entries within jump/link table corresponding to taba.
integer, dimension(:,:,:), allocatable idna
Message types (in array element 1) and subtypes (in array element 2) corresponding to taba.
integer, dimension(:), allocatable ntbd
Number of Table D entries for each file ID (up to a maximum of maxtbd, whose value is stored in array...
integer, dimension(:), allocatable ntbb
Number of Table B entries for each file ID (up to a maximum of maxtbb, whose value is stored in array...
integer, dimension(:,:), allocatable idnd
WMO bit-wise representations of the FXY values corresponding to tabd.
integer, dimension(:,:), allocatable idnb
WMO bit-wise representations of the FXY values corresponding to tabb.
character *128, dimension(:,:), allocatable tabb
Table B entries for each file ID.
recursive subroutine status(lunit, lun, il, im)
Check whether a specified Fortran logical unit number is currently connected to the NCEPLIBS-bufr sof...
logical function msgfull(msiz, itoadd, mxsiz)
Check whether the current data subset in the internal arrays will fit within the current BUFR message...
recursive subroutine getlens(mbay, ll, len0, len1, len2, len3, len4, len5)
Read the section lengths of a BUFR message, up to a specified point in the message.
subroutine rdmsgw(lunit, mesg, iret)
Read the next BUFR message from logical unit lunit as an array of integer words.
subroutine msgwrt(lunit, mesg, mgbyt)
Perform final checks and updates on a BUFR message before writing it to a specified Fortran logical u...
recursive integer function iupbs01(mbay, s01mnem)
Read a specified value from within Section 0 or Section 1 of a BUFR message.
subroutine parstr(str, tags, mtag, ntag, sep, limit80)
Parse a string containing one or more substrings into an array of substrings.
subroutine x48(iin4, iout8, nval)
Encode one or more 4-byte integer values as 8-byte integer values.
subroutine x84(iin8, iout4, nval)
Encode one or more 8-byte integer values as 4-byte integer values.