52 subroutine gb_info(cgrib, lcgrib, listsec0, listsec1, &
53 numfields, numlocal, maxlocal, ierr)
56 character(len = 1),
intent(in) :: cgrib(lcgrib)
57 integer,
intent(in) :: lcgrib
58 integer,
intent(out) :: listsec0(3), listsec1(13)
59 integer,
intent(out) :: numlocal, numfields, maxlocal, ierr
61 character(len = 4),
parameter :: grib =
'GRIB', c7777 =
'7777'
62 character(len = 4) :: ctemp
63 integer,
parameter :: zero = 0, one = 1
64 integer,
parameter :: mapsec1len = 13
65 integer,
parameter :: mapsec1(mapsec1len) = (/ 2, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1 /)
66 integer :: iofst, istart
67 integer :: nbits, lensec1, lensec0, lensec, lenposs, lengrib, j
68 integer :: i, ipos, isecnum
78 ctemp = cgrib(j) // cgrib(j + 1) // cgrib(j + 2) // cgrib(j+3)
79 if (ctemp .eq. grib )
then
84 if (istart .eq. 0)
then
85 print *,
'gb_info: Beginning characters GRIB not found.'
91 iofst = 8 * (istart + 5)
92 call g2_gbytec(cgrib, listsec0(1), iofst, 8)
94 call g2_gbytec(cgrib, listsec0(2), iofst, 8)
101 ipos = istart + lensec0
104 if (listsec0(2) .ne. 2)
then
105 print *,
'gb_info: can only decode GRIB edition 2.'
111 call g2_gbytec(cgrib, lensec1, iofst, 32)
115 if (isecnum .ne. 1)
then
116 print *,
'gb_info: Could not find section 1.'
125 nbits = mapsec1(i) * 8
126 call g2_gbytec(cgrib, listsec1(i), iofst, nbits)
127 iofst = iofst + nbits
129 ipos = ipos + lensec1
134 ctemp = cgrib(ipos) // cgrib(ipos + 1) // cgrib(ipos + 2) // cgrib(ipos + 3)
135 if (ctemp .eq. c7777 )
then
137 if (ipos .ne. (istart + lengrib))
then
138 print *,
'gb_info: "7777" found, but not where expected.'
144 iofst = (ipos - 1) * 8
150 if (ipos .gt. (istart + lengrib))
then
151 print *,
'gb_info: "7777" not found at end of GRIB message.'
155 if (isecnum .ge. 2 .AND. isecnum .le. 7)
then
156 if (isecnum .eq. 2)
then
158 numlocal = numlocal + 1
160 if (lenposs .gt. maxlocal) maxlocal = lenposs
161 elseif (isecnum .eq. 4)
then
163 numfields = numfields + 1
166 print *,
'gb_info: Invalid section number found in GRIB message: ', isecnum
246 subroutine gribinfo(cgrib, lcgrib, listsec0, listsec1, &
247 numlocal, numfields, maxvals, ierr)
250 character(len = 1),
intent(in) :: cgrib(lcgrib)
251 integer,
intent(in) :: lcgrib
252 integer,
intent(out) :: listsec0(3), listsec1(13), maxvals(7)
253 integer,
intent(out) :: numlocal, numfields, ierr
255 integer :: i, ipos, isecnum, j, lengrib, lenposs, lensec, lensec0, lensec1
256 integer :: maxcoordlist, maxdeflist, maxdrstmpl, maxgridpts, maxpdstmpl, maxgdstmpl
257 integer :: maxsec2len, nbits, nbyte, ngdpts, numcoord
258 character(len = 4),
parameter :: grib =
'GRIB', c7777 =
'7777'
259 character(len = 4) :: ctemp
260 integer,
parameter :: zero = 0, one = 1
261 integer,
parameter :: mapsec1len = 13
262 integer,
parameter :: mapsec1(mapsec1len) = (/ 2, 2, 1, 1, 1, 2, 1, 1, &
264 integer iofst, istart
280 ctemp = cgrib(j) // cgrib(j + 1) // cgrib(j + 2) // cgrib(j + 3)
281 if (ctemp .eq. grib)
then
286 if (istart .eq. 0)
then
287 print *,
'gribinfo: Beginning characters GRIB not found.'
293 iofst = 8 * (istart + 5)
294 call g2_gbytec(cgrib, listsec0(1), iofst, 8)
296 call g2_gbytec(cgrib, listsec0(2), iofst, 8)
299 call g2_gbytec(cgrib, lengrib, iofst, 32)
301 listsec0(3) = lengrib
303 ipos = istart + lensec0
306 if (listsec0(2) .ne. 2)
then
307 print *,
'gribinfo: can only decode GRIB edition 2.'
313 call g2_gbytec(cgrib, lensec1, iofst, 32)
317 if (isecnum .ne. 1)
then
318 print *,
'gribinfo: Could not find section 1.'
327 nbits = mapsec1(i) * 8
328 call g2_gbytec(cgrib, listsec1(i), iofst, nbits)
329 iofst = iofst + nbits
331 ipos = ipos + lensec1
337 ctemp = cgrib(ipos) // cgrib(ipos + 1) // cgrib(ipos + 2) // &
339 if (ctemp .eq. c7777)
then
341 if (ipos .ne. (istart + lengrib))
then
342 print *,
'gribinfo: "7777" found, but not where expected.'
348 iofst = (ipos - 1) * 8
354 if (ipos .gt. (istart + lengrib))
then
355 print *,
'gribinfo: "7777" not found at end of GRIB message.'
359 if (isecnum .eq. 2)
then
362 numlocal = numlocal + 1
364 if (lenposs .gt. maxsec2len) maxsec2len = lenposs
365 elseif (isecnum .eq. 3)
then
371 if (ngdpts .gt. maxgridpts) maxgridpts = ngdpts
372 lenposs = lensec - 14
373 if (lenposs .gt. maxgdstmpl) maxgdstmpl = lenposs
374 if (nbyte .ne. 0)
then
375 lenposs = lenposs / nbyte
376 if (lenposs .gt. maxdeflist) maxdeflist = lenposs
378 elseif (isecnum .eq. 4)
then
379 numfields = numfields + 1
380 call g2_gbytec(cgrib, numcoord, iofst, 16)
382 if (numcoord .ne. 0)
then
383 if (numcoord .gt. maxcoordlist) maxcoordlist = numcoord
386 if (lenposs.gt.maxpdstmpl) maxpdstmpl = lenposs
387 elseif (isecnum .eq. 5)
then
389 if (lenposs .gt. maxdrstmpl) maxdrstmpl = lenposs
393 maxvals(1) = maxsec2len
394 maxvals(2) = maxgdstmpl
395 maxvals(3) = maxdeflist
396 maxvals(4) = maxpdstmpl
397 maxvals(5) = maxcoordlist
398 maxvals(6) = maxdrstmpl
399 maxvals(7) = maxgridpts
502 subroutine getfield(cgrib, lcgrib, ifldnum, igds, igdstmpl, &
503 igdslen, ideflist, idefnum, ipdsnum, ipdstmpl, ipdslen, &
504 coordlist, numcoord, ndpts, idrsnum, idrstmpl, idrslen, &
505 ibmap, bmap, fld, ierr)
509 character(len = 1),
intent(in) :: cgrib(lcgrib)
510 integer,
intent(in) :: lcgrib, ifldnum
511 integer,
intent(out) :: igds(*), igdstmpl(*), ideflist(*)
512 integer,
intent(out) :: ipdsnum, ipdstmpl(*)
513 integer,
intent(out) :: idrsnum, idrstmpl(*)
514 integer,
intent(out) :: ndpts, ibmap, idefnum, numcoord
515 integer,
intent(out) :: ierr
516 logical*1,
intent(out) :: bmap(*)
517 real,
intent(out) :: fld(*), coordlist(*)
519 character(len = 4),
parameter :: grib =
'GRIB', c7777 =
'7777'
520 character(len = 4) :: ctemp
521 integer :: listsec0(2)
522 integer :: iofst, istart
523 real (kind = 4) :: ieee(1)
524 logical :: have3, have4, have5, have6, have7
527 integer,
intent(out) :: igdslen, ipdslen, idrslen
528 integer :: numfld, j, lengrib, lensec0, ipos
529 integer :: lensec, isecnum, jerr, ier, numlocal
541 if (ifldnum .le. 0)
then
542 print *,
'getfield: Request for field number ' &
551 ctemp = cgrib(j) // cgrib(j + 1) // cgrib(j + 2) // cgrib(j + 3)
552 if (ctemp .eq. grib)
then
557 if (istart .eq. 0)
then
558 print *,
'getfield: Beginning characters GRIB not found.'
564 iofst = 8 * (istart + 5)
565 call g2_gbytec(cgrib, listsec0(1), iofst, 8)
567 call g2_gbytec(cgrib, listsec0(2), iofst, 8)
570 call g2_gbytec(cgrib, lengrib, iofst, 32)
573 ipos = istart + lensec0
576 if (listsec0(2) .ne. 2)
then
577 print *,
'getfield: can only decode GRIB edition 2.'
587 ctemp = cgrib(ipos) // cgrib(ipos + 1) // cgrib(ipos + 2) // &
589 if (ctemp .eq. c7777)
then
592 if (ipos.ne.(istart + lengrib))
then
593 print *,
'getfield: "7777" found, but not ' &
601 iofst = (ipos - 1) * 8
610 if (isecnum .eq. 3)
then
612 call unpack3(cgrib, lcgrib, iofst, igds, igdstmpl, &
613 igdslen, ideflist, idefnum, jerr)
614 if (jerr .eq. 0)
then
624 if (isecnum .eq. 4)
then
626 if (numfld .eq. ifldnum)
then
628 call unpack4(cgrib, lcgrib, iofst, ipdsnum, ipdstmpl, &
629 ipdslen, coordlist, numcoord, jerr)
630 if (jerr .eq. 0)
then
641 if ((isecnum .eq. 5) .and. (numfld .eq. ifldnum))
then
643 call unpack5(cgrib, lcgrib, iofst, ndpts, idrsnum, &
644 idrstmpl, idrslen, jerr)
645 if (jerr .eq. 0)
then
655 if (isecnum .eq. 6)
then
657 call unpack6(cgrib, lcgrib, iofst, igds(2), ibmap, bmap, &
659 if (jerr .eq. 0)
then
669 if ((isecnum .eq. 7) .and. (numfld .eq. ifldnum))
then
670 if (idrsnum .eq. 0)
then
671 call simunpack(cgrib(ipos + 5), lensec - 6, idrstmpl, &
674 elseif (idrsnum .eq. 2 .or. idrsnum .eq. 3)
then
675 call comunpack(cgrib(ipos + 5), lensec - 6, lensec, &
676 idrsnum,idrstmpl, ndpts, fld, ier)
682 elseif (idrsnum .eq. 50)
then
683 call simunpack(cgrib(ipos + 5), lensec - 6, idrstmpl, &
685 ieee = transfer(idrstmpl(5), ieee, 1)
686 call rdieee(ieee, fld(1), 1)
688 elseif (idrsnum .eq. 40 .or. idrsnum .eq. 40000)
then
689 call jpcunpack(cgrib(ipos + 5), lensec - 5, idrstmpl, &
692 elseif (idrsnum .eq. 41 .or. idrsnum .eq. 40010)
then
693 call pngunpack(cgrib(ipos + 5), lensec - 5, idrstmpl, &
697 print *,
'getfield: Data Representation Template ', &
698 idrsnum,
' not yet implemented.'
707 if (ipos .gt. (istart + lengrib))
then
708 print *,
'getfield: "7777" not found at end' &
714 if (have3 .and. have4 .and. have5 .and. have6 .and. have7) &
721 print *,
'getfield: GRIB message contained ', numlocal, &
723 print *,
'getfield: The request was for the ', ifldnum, &
770 subroutine unpack3(cgrib, lcgrib, iofst, igds, igdstmpl, &
771 mapgridlen, ideflist, idefnum, ierr)
776 character(len = 1),
intent(in) :: cgrib(lcgrib)
777 integer,
intent(in) :: lcgrib
778 integer,
intent(inout) :: iofst
779 integer,
intent(out) :: igds(*), igdstmpl(*), ideflist(*)
780 integer,
intent(out) :: ierr, idefnum
782 integer,
allocatable :: mapgrid(:)
783 integer :: mapgridlen, ibyttem
787 integer :: lensec, iret, i, nbits, isign, newmapgridlen
797 call g2_gbytec(cgrib, igds(2), iofst, 32)
803 call g2_gbytec(cgrib, igds(5), iofst, 16)
805 if (igds(1) .eq. 0)
then
807 allocate(mapgrid(lensec))
811 if (iret .ne. 0)
then
826 nbits = iabs(mapgrid(i)) * 8
827 if (mapgrid(i) .ge. 0)
then
828 call g2_gbytec(cgrib, igdstmpl(i), iofst, nbits)
831 call g2_gbytec(cgrib, igdstmpl(i), iofst + 1, nbits-1)
832 if (isign .eq. 1) igdstmpl(i) = -igdstmpl(i)
834 iofst = iofst + nbits
835 ibyttem = ibyttem + iabs(mapgrid(i))
845 do i = mapgridlen + 1, newmapgridlen
846 nbits = iabs(mapgrid(i)) * 8
847 if (mapgrid(i) .ge. 0)
then
848 call g2_gbytec(cgrib, igdstmpl(i), iofst, nbits)
851 call g2_gbytec(cgrib, igdstmpl(i), iofst + 1, nbits - &
853 if (isign .eq. 1) igdstmpl(i) = -igdstmpl(i)
855 iofst = iofst + nbits
856 ibyttem = ibyttem + iabs(mapgrid(i))
858 mapgridlen = newmapgridlen
863 if (igds(3) .ne. 0)
then
865 idefnum = (lensec - 14 - ibyttem) / igds(3)
866 call g2_gbytesc(cgrib, ideflist, iofst, nbits, 0, idefnum)
867 iofst = iofst + (nbits * idefnum)
871 if (
allocated(mapgrid))
deallocate(mapgrid)
900 subroutine unpack4(cgrib, lcgrib, iofst, ipdsnum, ipdstmpl, &
901 mappdslen, coordlist, numcoord, ierr)
906 character(len = 1),
intent(in) :: cgrib(lcgrib)
907 integer,
intent(in) :: lcgrib
908 integer,
intent(inout) :: iofst
909 real,
intent(out) :: coordlist(*)
910 integer,
intent(out) :: ipdsnum, ipdstmpl(*)
911 integer,
intent(out) :: ierr, numcoord
913 real(4),
allocatable :: coordieee(:)
914 integer,
allocatable :: mappds(:)
919 integer :: lensec, iret, i, nbits, isign, newmappdslen
926 allocate(mappds(lensec))
928 call g2_gbytec(cgrib, numcoord, iofst, 16)
930 call g2_gbytec(cgrib, ipdsnum, iofst, 16)
943 nbits = iabs(mappds(i))*8
944 if (mappds(i).ge.0)
then
945 call g2_gbytec(cgrib, ipdstmpl(i), iofst, nbits)
948 call g2_gbytec(cgrib, ipdstmpl(i), iofst + 1, nbits-1)
949 if (isign.eq.1) ipdstmpl(i) = -ipdstmpl(i)
951 iofst = iofst + nbits
961 do i = mappdslen + 1, newmappdslen
962 nbits = iabs(mappds(i))*8
963 if (mappds(i).ge.0)
then
964 call g2_gbytec(cgrib, ipdstmpl(i), iofst, nbits)
967 call g2_gbytec(cgrib, ipdstmpl(i), iofst + 1, nbits-1)
968 if (isign.eq.1) ipdstmpl(i) = -ipdstmpl(i)
970 iofst = iofst + nbits
972 mappdslen = newmappdslen
977 if (numcoord .ne. 0)
then
978 allocate (coordieee(numcoord))
979 call g2_gbytescr(cgrib, coordieee, iofst, 32, 0, numcoord)
980 call rdieee(coordieee, coordlist, numcoord)
981 deallocate (coordieee)
982 iofst = iofst + (32*numcoord)
984 if (
allocated(mappds))
deallocate(mappds)
1009 subroutine unpack5(cgrib, lcgrib, iofst, ndpts, idrsnum, &
1010 idrstmpl, mapdrslen, ierr)
1015 character(len = 1),
intent(in) :: cgrib(lcgrib)
1016 integer,
intent(in) :: lcgrib
1017 integer,
intent(inout) :: iofst
1018 integer,
intent(out) :: ndpts, idrsnum, idrstmpl(*)
1019 integer,
intent(out) :: ierr
1022 integer,
allocatable :: mapdrs(:)
1023 integer :: mapdrslen
1027 integer :: lensec, i, nbits, isign, newmapdrslen, iret
1031 call g2_gbytec(cgrib, lensec, iofst, 32)
1034 allocate(mapdrs(lensec))
1038 call g2_gbytec(cgrib, idrsnum, iofst, 16)
1051 nbits = iabs(mapdrs(i))*8
1052 if (mapdrs(i).ge.0)
then
1053 call g2_gbytec(cgrib, idrstmpl(i), iofst, nbits)
1056 call g2_gbytec(cgrib, idrstmpl(i), iofst + 1, nbits-1)
1057 if (isign.eq.1) idrstmpl(i) = -idrstmpl(i)
1059 iofst = iofst + nbits
1068 do i = mapdrslen + 1, newmapdrslen
1069 nbits = iabs(mapdrs(i))*8
1070 if (mapdrs(i).ge.0)
then
1071 call g2_gbytec(cgrib, idrstmpl(i), iofst, nbits)
1074 call g2_gbytec(cgrib, idrstmpl(i), iofst + 1, nbits - 1)
1075 if (isign.eq.1) idrstmpl(i) = -idrstmpl(i)
1077 iofst = iofst + nbits
1079 mapdrslen = newmapdrslen
1081 if (
allocated(mapdrs))
deallocate(mapdrs)
1105 subroutine unpack6(cgrib, lcgrib, iofst, ngpts, ibmap, bmap, ierr)
1108 character(len = 1),
intent(in) :: cgrib(lcgrib)
1109 integer,
intent(in) :: lcgrib, ngpts
1110 integer,
intent(inout) :: iofst
1111 integer,
intent(out) :: ibmap
1112 integer,
intent(out) :: ierr
1113 logical*1,
intent(out) :: bmap(ngpts)
1115 integer :: intbmap(ngpts)
1128 if (ibmap.eq.0)
then
1129 call g2_gbytesc(cgrib, intbmap, iofst, 1, 0, ngpts)
1130 iofst = iofst + ngpts
1133 if (intbmap(j).eq.0) bmap(j) = .false.
1135 elseif (ibmap.eq.254)
then
1137 elseif (ibmap.eq.255)
then
1138 bmap(1:ngpts) = .true.
1140 print *,
'unpack6: Predefined bitmap ', ibmap, &
1161 subroutine getdim(csec3,lcsec3,width,height,iscan)
1164 character(len=1),
intent(in) :: csec3(*)
1165 integer,
intent(in) :: lcsec3
1166 integer,
intent(out) :: width,height,iscan
1168 integer,
pointer,
dimension(:) :: igdstmpl,list_opt
1170 integer iofst,igdtlen,num_opt,jerr
1173 subroutine gf_unpack3(cgrib,lcgrib,iofst,igds,igdstmpl, &
1174 mapgridlen,ideflist,idefnum,ierr)
1175 character(len=1),
intent(in) :: cgrib(lcgrib)
1176 integer,
intent(in) :: lcgrib
1177 integer,
intent(inout) :: iofst
1178 integer,
pointer,
dimension(:) :: igdstmpl,ideflist
1179 integer,
intent(out) :: igds(5)
1180 integer,
intent(out) :: ierr,idefnum
1184 nullify(igdstmpl,list_opt)
1187 call gf_unpack3(csec3,lcsec3,iofst,igds,igdstmpl, &
1188 igdtlen,list_opt,num_opt,jerr)
1190 selectcase( igds(5) )
1229 if (
associated(igdstmpl))
deallocate(igdstmpl)
1230 if (
associated(list_opt))
deallocate(list_opt)
1262 subroutine getlocal(cgrib, lcgrib, localnum, csec2, lcsec2, ierr)
1265 character(len = 1),
intent(in) :: cgrib(lcgrib)
1266 integer,
intent(in) :: lcgrib, localnum
1267 character(len = 1),
intent(out) :: csec2(*)
1268 integer,
intent(out) :: lcsec2, ierr
1270 character(len = 4),
parameter :: grib =
'GRIB', c7777 =
'7777'
1271 character(len = 4) :: ctemp
1272 integer :: listsec0(2)
1273 integer iofst, istart, numlocal
1274 integer :: lengrib, lensec, lensec0, j, ipos, isecnum
1280 if (localnum .le. 0)
then
1281 print *,
'getlocal: Request for local section must be positive.'
1289 ctemp = cgrib(j)//cgrib(j+1)//cgrib(j+2)//cgrib(j+3)
1290 if (ctemp .eq. grib)
then
1295 if (istart .eq. 0)
then
1296 print *,
'getlocal: Beginning characters GRIB not found.'
1302 iofst = 8 * (istart + 5)
1303 call g2_gbytec(cgrib, listsec0(1), iofst, 8)
1305 call g2_gbytec(cgrib, listsec0(2), iofst, 8)
1308 call g2_gbytec(cgrib, lengrib, iofst, 32)
1311 ipos = istart + lensec0
1314 if (listsec0(2) .ne. 2)
then
1315 print *,
'getlocal: can only decode GRIB edition 2.'
1325 ctemp = cgrib(ipos) // cgrib(ipos + 1) // cgrib(ipos + 2) // cgrib(ipos + 3)
1326 if (ctemp .eq. c7777)
then
1330 if (ipos .ne. (istart + lengrib))
then
1331 print *,
'getlocal: "7777" found, but not where expected.'
1339 iofst = (ipos - 1) * 8
1340 call g2_gbytec(cgrib, lensec, iofst, 32)
1342 call g2_gbytec(cgrib, isecnum, iofst, 8)
1347 if (isecnum .eq. 2)
then
1348 numlocal = numlocal + 1
1349 if (numlocal.eq.localnum)
then
1351 csec2(1:lcsec2) = cgrib(ipos + 5:ipos + lensec - 1)
1358 ipos = ipos + lensec
1359 if (ipos .gt. (istart + lengrib))
then
1360 print *,
'getlocal: "7777" not found at end of GRIB message.'
1368 print *,
'getlocal: GRIB message contained ', numlocal,
' local sections.'
1369 print *,
'getlocal: The request was for the ', localnum,
' occurrence.'
1391 character(len=1),
intent(in) :: csec3(*)
1392 integer,
intent(in) :: lcsec3
1393 integer,
intent(out) :: jj,kk,mm
1395 integer,
pointer,
dimension(:) :: igdstmpl,list_opt
1397 integer iofst,igdtlen,num_opt,jerr
1400 subroutine gf_unpack3(cgrib,lcgrib,iofst,igds,igdstmpl, &
1401 mapgridlen,ideflist,idefnum,ierr)
1402 character(len=1),
intent(in) :: cgrib(lcgrib)
1403 integer,
intent(in) :: lcgrib
1404 integer,
intent(inout) :: iofst
1405 integer,
pointer,
dimension(:) :: igdstmpl,ideflist
1406 integer,
intent(out) :: igds(5)
1407 integer,
intent(out) :: ierr,idefnum
1411 nullify(igdstmpl,list_opt)
1414 call gf_unpack3(csec3,lcsec3,iofst,igds,igdstmpl, &
1415 igdtlen,list_opt,num_opt,jerr)
1417 selectcase( igds(5) )
1433 if (
associated(igdstmpl))
deallocate(igdstmpl)
1434 if (
associated(list_opt))
deallocate(list_opt)
1499 igdslen, ideflist, idefnum, ipdsnum, ipdstmpl, ipdslen, coordlist, numcoord, ierr)
1502 character(len = 1),
intent(in) :: cgrib(lcgrib)
1503 integer,
intent(in) :: lcgrib, ifldnum
1504 integer,
intent(out) :: igds(*), igdstmpl(*), ideflist(*)
1505 integer,
intent(out) :: ipdsnum, ipdstmpl(*)
1506 integer,
intent(out) :: idefnum, numcoord
1507 integer,
intent(out) :: ierr
1508 real,
intent(out) :: coordlist(*)
1510 character(len = 4),
parameter :: grib =
'GRIB', c7777 =
'7777'
1511 character(len = 4) :: ctemp
1512 integer:: listsec0(2)
1513 integer iofst, istart
1514 logical have3, have4
1515 integer :: igdslen, ipdslen, ipos, isecnum, j, jerr, lengrib, lensec, lensec0, numfld
1523 if (ifldnum .le. 0)
then
1524 print *,
'gettemplates: Request for field number must be positive.'
1532 ctemp = cgrib(j) // cgrib(j + 1) // cgrib(j + 2) // cgrib(j + 3)
1533 if (ctemp .eq. grib )
then
1538 if (istart .eq. 0)
then
1539 print *,
'gettemplates: Beginning characters GRIB not found.'
1545 iofst = 8 * (istart + 5)
1546 call g2_gbytec(cgrib, listsec0(1), iofst, 8)
1548 call g2_gbytec(cgrib, listsec0(2), iofst, 8)
1551 call g2_gbytec(cgrib, lengrib, iofst, 32)
1554 ipos = istart + lensec0
1557 if (listsec0(2) .ne. 2)
then
1558 print *,
'gettemplates: can only decode GRIB edition 2.'
1568 ctemp = cgrib(ipos) // cgrib(ipos + 1) // cgrib(ipos + 2) // cgrib(ipos + 3)
1569 if (ctemp .eq. c7777 )
then
1572 if (ipos .ne. (istart + lengrib))
then
1573 print *,
'gettemplates: "7777" found, but not where expected.'
1580 iofst = (ipos - 1) * 8
1581 call g2_gbytec(cgrib, lensec, iofst, 32)
1583 call g2_gbytec(cgrib, isecnum, iofst, 8)
1590 if (isecnum .eq. 3)
then
1592 call unpack3(cgrib, lcgrib, iofst, igds, igdstmpl, igdslen, ideflist, idefnum, jerr)
1593 if (jerr .eq. 0)
then
1603 if (isecnum .eq. 4)
then
1605 if (numfld .eq. ifldnum)
then
1607 call unpack4(cgrib, lcgrib, iofst, ipdsnum, ipdstmpl, ipdslen, coordlist, numcoord, jerr)
1608 if (jerr .eq. 0)
then
1619 ipos = ipos + lensec
1620 if (ipos .gt. (istart + lengrib))
then
1621 print *,
'gettemplates: "7777" not found at end of GRIB message.'
1626 if (have3.and.have4)
return
1631 print *,
'gettemplates: GRIB message contained ', numfld,
' different fields.'
1632 print *,
'gettemplates: The request was for the ', ifldnum,
' field.'
subroutine comunpack(cpack, len, lensec, idrsnum, idrstmpl, ndpts, fld, ier)
Unpack a data field that was packed using a complex packing algorithm as defined in the GRIB2 documen...
subroutine g2_gbytesc(in, iout, iskip, nbits, nskip, n)
Extract arbitrary size big-endian integer values (up to 32 bits each) from a packed bit string.
subroutine rdieee(rieee, a, num)
Copy array of 32-bit IEEE floating point values to local floating point representation.
subroutine g2_gbytec(in, iout, iskip, nbits)
Extract one arbitrary size big-endian value (up to 32 bits) from a packed bit string into one element...
subroutine g2_gbytescr(in, rout, iskip, nbits, nskip, n)
Extract big-endian floating-point values (32 bits each) from a packed bit string.
subroutine getfield(cgrib, lcgrib, ifldnum, igds, igdstmpl, igdslen, ideflist, idefnum, ipdsnum, ipdstmpl, ipdslen, coordlist, numcoord, ndpts, idrsnum, idrstmpl, idrslen, ibmap, bmap, fld, ierr)
Return the Grid Definition, Product Definition, Bit-map (if applicable), and the unpacked data for a ...
subroutine gb_info(cgrib, lcgrib, listsec0, listsec1, numfields, numlocal, maxlocal, ierr)
Find the number of gridded fields and Local Use Sections in a GRIB2 message.
subroutine gettemplates(cgrib, lcgrib, ifldnum, igds, igdstmpl, igdslen, ideflist, idefnum, ipdsnum, ipdstmpl, ipdslen, coordlist, numcoord, ierr)
Return the Grid Definition and Product Definition for a data field.
subroutine unpack6(cgrib, lcgrib, iofst, ngpts, ibmap, bmap, ierr)
This subroutine unpacks Section 6 (Bit-Map Section) starting at octet 6 of that Section.
subroutine unpack4(cgrib, lcgrib, iofst, ipdsnum, ipdstmpl, mappdslen, coordlist, numcoord, ierr)
This subroutine unpacks Section 4 (Product Definition Section) starting at octet 6 of that Section.
subroutine getlocal(cgrib, lcgrib, localnum, csec2, lcsec2, ierr)
Return the contents of Section 2 (Local Use) from a GRIB2 message.
subroutine unpack3(cgrib, lcgrib, iofst, igds, igdstmpl, mapgridlen, ideflist, idefnum, ierr)
This subroutine unpacks Section 3 (Grid Definition Section) starting at octet 6 of that Section.
subroutine getdim(csec3, lcsec3, width, height, iscan)
Return the dimensions and scanning mode of a grid definition packed in the Grid Definition Section.
subroutine getpoly(csec3, lcsec3, jj, kk, mm)
Return the J, K, and M pentagonal resolution parameters specified in a GRIB2 Grid Definition Section ...
subroutine unpack5(cgrib, lcgrib, iofst, ndpts, idrsnum, idrstmpl, mapdrslen, ierr)
This subroutine unpacks Section 5 (Data Representation Section) starting at octet 6 of that Section.
subroutine gribinfo(cgrib, lcgrib, listsec0, listsec1, numlocal, numfields, maxvals, ierr)
Find the number of Local Use Sections and gridded fields in a GRIB2 message, and the maximum sizes of...
subroutine jpcunpack(cpack, len, idrstmpl, ndpts, fld)
Unpack a data field from a JPEG2000 code stream as defined in Data Representation Template 5....
subroutine pngunpack(cpack, len, idrstmpl, ndpts, fld)
Unpack a data field with PNG, defined in [Data Representation Template 5.40](https://www....
subroutine simunpack(cpack, len, idrstmpl, ndpts, fld)
Unpack a data field that was packed using a simple packing, [Data Representation Template 5....
subroutine gf_unpack3(cgrib, lcgrib, iofst, igds, igdstmpl, mapgridlen, ideflist, idefnum, ierr)
Unpack Section 3 (Grid Definition Section) of a GRIB2 message, starting at octet 6 of that Section.
Handles Data Representation Templates used in Section 5.
subroutine getdrstemplate(number, nummap, map, needext, iret)
Return DRS template information for a specified Data Representation Template.
subroutine extdrstemplate(number, list, nummap, map)
Generate the remaining octet map for a given Data Representation Template, if required.
This Fortran module contains info on all the available GRIB2 Grid Definition Templates used in [Secti...
subroutine getgridtemplate(number, nummap, map, needext, iret)
Get the grid template information for a specified Grid Definition Template.
subroutine extgridtemplate(number, list, nummap, map)
Generate the remaining octet map for a given Grid Definition Template, if required.
Information on all GRIB2 Product Definition Templates used in Section 4 - the Product Definition Sect...
subroutine extpdstemplate(number, list, nummap, map)
This subroutine generates the remaining octet map for a given Product Definition Template,...
subroutine getpdstemplate(number, nummap, map, needext, iret)
This subroutine returns PDS template information for a specified Product Definition Template.