23 integer,
intent(in) :: lugb, lugi, idxver
24 character*(*) :: filename
25 integer,
intent(out) :: iret
27 integer (kind = 8) :: msk1, msk2
28 parameter(msk1 = 32000_8, msk2 = 4000_8)
29 character(len=1),
pointer,
dimension(:) :: cbuf
30 integer :: numtot, nnum, nlen, mnum, kw
31 integer :: irgi, iw, nmess
34 subroutine getg2i2r(lugb, msk1, msk2, mnum, idxver, cbuf, &
35 nlen, nnum, nmess, iret)
36 integer,
intent(in) :: lugb
37 integer (kind = 8),
intent(in) :: msk1, msk2
38 integer,
intent(in) :: mnum, idxver
39 character(len = 1),
pointer,
dimension(:) :: cbuf
40 integer,
intent(out) :: nlen, nnum, nmess, iret
52 call getg2i2r(lugb, msk1, msk2, mnum, idxver, cbuf, &
53 nlen, nnum, nmess, irgi)
54 if (irgi .gt. 1 .or. nnum .eq. 0 .or. nlen .eq. 0)
then
58 numtot = numtot + nnum
66 call bawrite(lugi, iw, nlen, kw, cbuf)
71 do while (irgi .eq. 1 .and. nnum .gt. 0)
72 if (
associated(cbuf))
then
76 call getg2i2r(11, msk1, msk2, mnum, idxver, cbuf, &
77 nlen, nnum, nmess, irgi)
78 if (irgi .le. 1 .and. nnum .gt. 0)
then
79 numtot = numtot + nnum
81 call bawrite(lugi, iw, nlen, kw, cbuf)
105 integer,
intent(in) :: lugi, nlen, nnum, idxver
106 character,
intent(in) :: filename*(*)
108 character cd8*8, ct10*10, hostname*15
115 character chead(2)*81
119 call date_and_time(cd8, ct10)
121 chead(1)(9:10) =
' 1'
122 chead(1)(12:14) =
' 1'
123 write(chead(1)(16:20),
'(i5)') 162
124 chead(1)(22:31) = cd8(1:4) //
'-' // cd8(5:6) //
'-' // cd8(7:8)
125 chead(1)(33:40) = ct10(1:2) //
':' // ct10(3:4) //
':' // ct10(5:6)
126 chead(1)(42:47) =
'GB2IX1'
127 chead(1)(49:54) =
' '
129 istat = hostnm(hostname)
130 if (istat .eq. 0)
then
131 chead(1)(56:70) =
'0000'
133 chead(1)(56:70) =
'0001'
136 chead(1)(56:70) = hostnam(hostname)
138 chead(1)(72:80) =
'grb2index'
139 chead(1)(81:81) = char(10)
142 if (idxver .eq. 1)
then
143 chead(2) =
'IX1FORM:'
145 chead(2) =
'IX2FORM:'
147 write(chead(2)(9:38),
'(3i10)') 162, nlen, nnum
148 chead(2)(41:80) = filename
149 chead(2)(81:81) = char(10)
152 call bawrite(lugi, 0, 162, kw, chead)
197 subroutine getidx(lugb, lugi, cindex, nlen, nnum, iret)
200 integer,
intent(in) :: lugb, lugi
201 character(len = 1),
pointer,
dimension(:) :: cindex
202 integer,
intent(out) :: nlen, nnum, iret
206 subroutine getidx2(lugb, lugi, idxver, cindex, nlen, nnum, iret)
207 integer,
intent(in) :: lugb, lugi
208 integer,
intent(inout) :: idxver
209 character(len = 1),
pointer,
dimension(:) :: cindex
210 integer,
intent(out) :: nlen, nnum, iret
217 call getidx2(lugb, lugi, idxver, cindex, nlen, nnum, iret)
220 if (iret .eq. 0 .and. idxver .eq. 2) iret = 97
265 subroutine getidx2(lugb, lugi, idxver, cindex, nlen, nnum, iret)
268 integer,
intent(in) :: lugb, lugi
269 integer,
intent(inout) :: idxver
270 character(len = 1),
pointer,
dimension(:) :: cindex
271 integer,
intent(out) :: nlen, nnum, iret
273 integer,
parameter :: maxidx = 10000
274 integer (kind = 8),
parameter :: msk1 = 32000_8, msk2 = 4000_8
276 integer :: irgi, mskp, nmess, i
282 character(len = 1),
pointer,
dimension(:) :: cbuf
285 type(gindex),
save :: idxlist(10000)
291 subroutine getg2i2(lugi, cbuf, idxver, nlen, nnum, iret)
292 integer,
intent(in) :: lugi
293 character(len=1),
pointer,
dimension(:) :: cbuf
294 integer,
intent(out) :: idxver, nlen, nnum, iret
296 subroutine getg2i2r(lugb, msk1, msk2, mnum, idxver, cbuf, &
297 nlen, nnum, nmess, iret)
298 integer,
intent(in) :: lugb
299 integer (kind = 8),
intent(in) :: msk1, msk2
300 integer,
intent(in) :: mnum, idxver
301 character(len = 1),
pointer,
dimension(:) :: cbuf
302 integer,
intent(out) :: nlen, nnum, nmess, iret
307 if (lugb .eq. 0)
then
310 if (
associated(idxlist(i)%cbuf))
then
312 deallocate(idxlist(i)%cbuf)
313 nullify(idxlist(i)%cbuf)
323 if (lugb .le. 0 .or. lugb .gt. 9999)
then
324 print *,
' file unit number out of range'
325 print *,
' use unit numbers in range: 0 - 9999 '
331 if (lugi .eq. lugb)
then
332 if (
associated(idxlist(lugb)%cbuf)) &
333 deallocate(idxlist(lugb)%cbuf)
335 nullify(idxlist(lugb)%cbuf)
336 idxlist(lugb)%nlen = 0
337 idxlist(lugb)%nnum = 0
342 if (lugi .lt. 0)
then
344 if (
associated(idxlist(lugb)%cbuf)) &
345 deallocate(idxlist(lugb)%cbuf)
347 nullify(idxlist(lugb)%cbuf)
348 idxlist(lugb)%nlen = 0
349 idxlist(lugb)%nnum = 0
354 if (
associated(idxlist(lugb)%cbuf))
then
356 cindex => idxlist(lugb)%cbuf
357 nlen = idxlist(lugb)%nlen
358 nnum = idxlist(lugb)%nnum
359 idxver = idxlist(lugb)%idxver
368 call getg2i2(lux, idxlist(lugb)%cbuf, idxver, nlen, nnum, irgi)
369 elseif (lux .le. 0)
then
371 call getg2i2r(lugb, msk1, msk2, mskp, idxver, idxlist(lugb)%cbuf, &
372 nlen, nnum, nmess, irgi)
376 if (irgi .ne. 0)
then
379 print *,
' error reading index file '
385 cindex => idxlist(lugb)%cbuf
386 idxlist(lugb)%nlen = nlen
387 idxlist(lugb)%nnum = nnum
388 idxlist(lugb)%idxver = idxver
421 subroutine getg2i(lugi, cbuf, nlen, nnum, iret)
424 integer,
intent(in) :: lugi
425 character(len=1),
pointer,
dimension(:) :: cbuf
426 integer,
intent(out) :: nlen, nnum, iret
430 subroutine getg2i2(lugi, cbuf, idxver, nlen, nnum, iret)
431 integer,
intent(in) :: lugi
432 character(len=1),
pointer,
dimension(:) :: cbuf
433 integer,
intent(out) :: idxver, nlen, nnum, iret
440 call getg2i2(lugi, cbuf, idxver, nlen, nnum, iret)
441 if (idxver .eq. 2) iret = 5
503 subroutine getg2i2(lugi, cbuf, idxver, nlen, nnum, iret)
506 integer,
intent(in) :: lugi
507 character(len=1),
pointer,
dimension(:) :: cbuf
508 integer,
intent(out) :: idxver, nlen, nnum, iret
511 integer :: ios, istat, lbuf, lhead, nskp
517 call baread(lugi, 0, 162, lhead, chead)
518 if (lhead .eq. 162 .and. chead(42:47) .eq.
'GB2IX1')
then
519 read(chead(82:162),
'(2x, i1, 5x, 3i10, 2x, a40)', iostat = ios) idxver, nskp, nlen, nnum
521 allocate(cbuf(nlen), stat = istat)
522 if (istat .ne. 0)
then
527 call baread(lugi, nskp, nlen, lbuf, cbuf)
528 if (lbuf .ne. nlen) iret = 3
565 subroutine getg2ir(lugb, msk1, msk2, mnum, cbuf, nlen, nnum, nmess, iret)
569 integer,
intent(in) :: lugb
570 integer,
intent(in) :: msk1, msk2
571 integer,
intent(in) :: mnum
572 character(len = 1),
pointer,
dimension(:) :: cbuf
573 integer,
intent(out) :: nlen, nnum, nmess, iret
575 integer (kind = 8) :: msk1_8, msk2_8
578 subroutine getg2i2r(lugb, msk1, msk2, mnum, idxver, cbuf, &
579 nlen, nnum, nmess, iret)
580 integer,
intent(in) :: lugb
581 integer (kind = 8),
intent(in) :: msk1, msk2
582 integer,
intent(in) :: mnum, idxver
583 character(len = 1),
pointer,
dimension(:) :: cbuf
584 integer,
intent(out) :: nlen, nnum, nmess, iret
590 call getg2i2r(lugb, msk1_8, msk2_8, mnum, 1, cbuf, nlen, nnum, nmess, iret)
626 subroutine getg2i2r(lugb, msk1, msk2, mnum, idxver, cbuf, nlen, nnum, nmess, iret)
630 integer,
intent(in) :: lugb
631 integer (kind = 8),
intent(in) :: msk1, msk2
632 integer,
intent(in) :: mnum, idxver
633 character(len = 1),
pointer,
dimension(:) :: cbuf
634 integer,
intent(out) :: nlen, nnum, nmess, iret
636 character(len = 1),
pointer,
dimension(:) :: cbuftmp
637 integer :: nbytes, newsize, next, numfld, m, mbuf
638 integer (kind = 8) :: iseek, lskip, lgrib
639 integer :: istat, init, iret1, lgrib4
640 parameter(init = 50000, next = 10000)
643 subroutine ix2gb2(lugb, lskip8, idxver, lgrib, cbuf, numfld, mlen, iret)
645 integer (kind = 8) :: lskip8
646 integer :: idxver, lgrib
647 character(len = 1),
pointer,
dimension(:) :: cbuf
648 integer :: numfld, mlen, iret
656 allocate(cbuf(mbuf), stat = istat)
657 if (istat .ne. 0)
then
664 call skgb8(lugb, iseek, msk1, lskip, lgrib)
666 if (lgrib .gt. 0)
then
667 iseek = lskip + lgrib
668 call skgb8(lugb, iseek, msk2, lskip, lgrib)
676 do while (iret .eq. 0 .and. lgrib .gt. 0)
677 lgrib4 = int(lgrib, kind(4))
678 call ix2gb2(lugb, lskip, idxver, lgrib4, cbuftmp, numfld, nbytes, iret1)
679 if (iret1 .ne. 0) print *,
' SAGT ', numfld, nbytes, iret1
680 if((nbytes + nlen) .gt. mbuf)
then
681 newsize = max(mbuf + next, mbuf + nbytes)
682 call realloc(cbuf, nlen, newsize, istat)
683 if (istat .ne. 0)
then
692 if (
associated(cbuftmp))
then
693 cbuf(nlen + 1 : nlen + nbytes) = cbuftmp(1 : nbytes)
694 deallocate(cbuftmp, stat = istat)
695 if (istat .ne. 0)
then
696 print *,
' deallocating cbuftmp ... ', istat
707 iseek = lskip + lgrib
708 call skgb8(lugb, iseek, msk2, lskip, lgrib)
784 subroutine getgb2s(cbuf, nlen, nnum, j, jdisc, jids, jpdtn, jpdt, jgdtn, &
785 jgdt, k, gfld, lpos, iret)
789 character(len = 1),
intent(in) :: cbuf(nlen)
790 integer,
intent(in) :: nlen, nnum, j, jdisc
791 integer,
dimension(:) :: jids(*)
792 integer,
intent(in) :: jpdtn
793 integer,
dimension(:) :: jpdt(*)
794 integer,
intent(in) :: jgdtn
795 integer,
dimension(:) :: jgdt(*)
796 integer,
intent(out) :: k
798 integer,
intent(out) :: lpos, iret
801 subroutine getgb2s2(cbuf, idxver, nlen, nnum, j, jdisc, jids, jpdtn, jpdt, jgdtn, &
802 jgdt, k, gfld, lpos, iret)
804 character(len = 1),
intent(in) :: cbuf(nlen)
805 integer,
intent(in) :: idxver, nlen, nnum, j, jdisc
806 integer,
dimension(:) :: jids(*)
807 integer,
intent(in) :: jpdtn
808 integer,
dimension(:) :: jpdt(*)
809 integer,
intent(in) :: jgdtn
810 integer,
dimension(:) :: jgdt(*)
811 integer,
intent(out) :: k
813 integer,
intent(out) :: lpos, iret
819 call getgb2s2(cbuf, 1, nlen, nnum, j, jdisc, jids, jpdtn, jpdt, jgdtn, &
820 jgdt, k, gfld, lpos, iret)
897 subroutine getgb2s2(cbuf, idxver, nlen, nnum, j, jdisc, jids, jpdtn, jpdt, jgdtn, &
898 jgdt, k, gfld, lpos, iret)
902 character(len = 1),
intent(in) :: cbuf(nlen)
903 integer,
intent(in) :: idxver, nlen, nnum, j, jdisc
904 integer,
dimension(:) :: jids(*)
905 integer,
intent(in) :: jpdtn
906 integer,
dimension(:) :: jpdt(*)
907 integer,
intent(in) :: jgdtn
908 integer,
dimension(:) :: jgdt(*)
909 integer,
intent(out) :: k
911 integer,
intent(out) :: lpos, iret
914 logical :: match1, match3, match4
915 integer :: i, icnd, inlen, iof, ipos, jpos, lsec1, lsec3, lsec4, lsec5, numgdt, numpdt, inc
918 subroutine gf_unpack1(cgrib, lcgrib, iofst, ids, idslen, ierr)
919 character(len = 1),
intent(in) :: cgrib(lcgrib)
920 integer,
intent(in) :: lcgrib
921 integer,
intent(inout) :: iofst
922 integer,
pointer,
dimension(:) :: ids
923 integer,
intent(out) :: ierr, idslen
925 subroutine gf_unpack3(cgrib, lcgrib, iofst, igds, igdstmpl, &
926 mapgridlen, ideflist, idefnum, ierr)
927 character(len = 1),
intent(in) :: cgrib(lcgrib)
928 integer,
intent(in) :: lcgrib
929 integer,
intent(inout) :: iofst
930 integer,
pointer,
dimension(:) :: igdstmpl, ideflist
931 integer,
intent(out) :: igds(5)
932 integer,
intent(out) :: ierr, idefnum
934 subroutine gf_unpack4(cgrib, lcgrib, iofst, ipdsnum, ipdstmpl, &
935 mappdslen, coordlist, numcoord, ierr)
936 character(len = 1),
intent(in) :: cgrib(lcgrib)
937 integer,
intent(in) :: lcgrib
938 integer,
intent(inout) :: iofst
939 real,
pointer,
dimension(:) :: coordlist
940 integer,
pointer,
dimension(:) :: ipdstmpl
941 integer,
intent(out) :: ipdsnum
942 integer,
intent(out) :: ierr, numcoord
944 subroutine gf_unpack5(cgrib, lcgrib, iofst, ndpts, idrsnum, &
945 idrstmpl, mapdrslen, ierr)
946 character(len = 1),
intent(in) :: cgrib(lcgrib)
947 integer,
intent(in) :: lcgrib
948 integer,
intent(inout) :: iofst
949 integer,
intent(out) :: ndpts, idrsnum
950 integer,
pointer,
dimension(:) :: idrstmpl
951 integer,
intent(out) :: ierr
960 nullify(gfld%idsect, gfld%local)
961 nullify(gfld%list_opt, gfld%igdtmpl, gfld%ipdtmpl)
962 nullify(gfld%coord_list, gfld%idrtmpl, gfld%bmap, gfld%fld)
963 if (idxver .eq. 1)
then
972 do while(iret .ne. 0 .and. k .lt. nnum)
975 call g2_gbytec(cbuf, inlen, ipos * 8, 4 * 8)
982 call g2_gbytec(cbuf, gfld%discipline, (ipos + inc + 41) * 8, 1 * 8)
983 if (jdisc .ne. -1 .and. jdisc .ne. gfld%discipline)
then
991 call g2_gbytec(cbuf, lsec1, (ipos + inc + 44) * 8, 4 * 8)
993 call gf_unpack1(cbuf(ipos + inc + 45), lsec1, iof, gfld%idsect, gfld%idsectlen, icnd)
994 if (icnd .eq. 0)
then
996 do i = 1, gfld%idsectlen
997 if (jids(i) .ne. -9999 .and. jids(i) .ne. gfld%idsect(i))
then
1003 if (.not. match1)
then
1004 deallocate(gfld%idsect)
1010 jpos = ipos + 44 + inc + lsec1
1012 call g2_gbytec(cbuf, lsec3, jpos * 8, 4 * 8)
1013 if (jgdtn .eq. -1)
then
1016 call g2_gbytec(cbuf, numgdt, (jpos + 12) * 8, 2 * 8)
1017 if (jgdtn .eq. numgdt)
then
1019 call gf_unpack3(cbuf(jpos + 1), lsec3, iof, kgds, gfld%igdtmpl, &
1020 gfld%igdtlen, gfld%list_opt, gfld%num_opt, icnd)
1021 if (icnd .eq. 0)
then
1023 do i = 1, gfld%igdtlen
1024 if (jgdt(i) .ne. -9999 .and. jgdt(i).ne.gfld%igdtmpl(i))
then
1032 if (.not. match3)
then
1033 if (
associated(gfld%idsect))
deallocate(gfld%idsect)
1034 if (
associated(gfld%igdtmpl))
deallocate(gfld%igdtmpl)
1035 if (
associated(gfld%list_opt))
deallocate(gfld%list_opt)
1039 gfld%griddef = kgds(1)
1040 gfld%ngrdpts = kgds(2)
1041 gfld%numoct_opt = kgds(3)
1042 gfld%interp_opt = kgds(4)
1043 gfld%igdtnum = kgds(5)
1051 call g2_gbytec(cbuf, lsec4, jpos * 8, 4 * 8)
1052 if (jpdtn .eq. -1)
then
1056 call g2_gbytec(cbuf, numpdt, (jpos + 7) * 8, 2 * 8)
1057 if (jpdtn .eq. numpdt)
then
1059 call gf_unpack4(cbuf(jpos + 1), lsec4, iof, gfld%ipdtnum, &
1060 gfld%ipdtmpl, gfld%ipdtlen, gfld%coord_list, gfld%num_coord, icnd)
1061 if (icnd .eq. 0)
then
1063 do i = 1, gfld%ipdtlen
1064 if (jpdt(i) .ne. -9999 .and. jpdt(i) .ne. gfld%ipdtmpl(i))
then
1072 if (.not. match4)
then
1073 if (
associated(gfld%idsect))
deallocate(gfld%idsect)
1074 if (
associated(gfld%ipdtmpl))
deallocate(gfld%ipdtmpl)
1075 if (
associated(gfld%coord_list))
deallocate(gfld%coord_list)
1079 if (match1 .and. match3 .and. match4)
then
1081 call g2_gbytec(cbuf, gfld%version, (ipos + inc + 40) * 8, 1 * 8)
1082 call g2_gbytec(cbuf, gfld%ifldnum, (ipos + inc + 42) * 8, 2 * 8)
1083 gfld%unpacked = .false.
1084 jpos = ipos + 44 + inc + lsec1
1085 if (jgdtn .eq. -1)
then
1087 call gf_unpack3(cbuf(jpos + 1), lsec3, iof, kgds, gfld%igdtmpl, &
1088 gfld%igdtlen, gfld%list_opt, gfld%num_opt, icnd)
1089 gfld%griddef = kgds(1)
1090 gfld%ngrdpts = kgds(2)
1091 gfld%numoct_opt = kgds(3)
1092 gfld%interp_opt = kgds(4)
1093 gfld%igdtnum = kgds(5)
1096 if (jpdtn .eq. -1)
then
1098 call gf_unpack4(cbuf(jpos + 1), lsec4, iof, gfld%ipdtnum, &
1099 gfld%ipdtmpl, gfld%ipdtlen, gfld%coord_list, gfld%num_coord, icnd)
1102 call g2_gbytec(cbuf, lsec5, jpos * 8, 4 * 8)
1104 call gf_unpack5(cbuf(jpos + 1), lsec5, iof, gfld%ndpts, &
1105 gfld%idrtnum, gfld%idrtmpl, gfld%idrtlen, icnd)
1107 call g2_gbytec(cbuf, gfld%ibmap, (jpos + 5) * 8, 1 * 8)
1148 subroutine ixgb2(lugb, lskip, lgrib, cbuf, numfld, mlen, iret)
1152 integer :: lugb, lskip, lgrib
1153 character(len = 1),
pointer,
dimension(:) :: cbuf
1154 integer :: numfld, mlen, iret
1155 integer (kind = 8) :: lskip8
1158 subroutine ix2gb2(lugb, lskip8, idxver, lgrib, cbuf, numfld, mlen, iret)
1160 integer (kind = 8) :: lskip8
1161 integer :: idxver, lgrib
1162 character(len = 1),
pointer,
dimension(:) :: cbuf
1163 integer :: numfld, mlen, iret
1169 call ix2gb2(lugb, lskip8, 1, lgrib, cbuf, numfld, mlen, iret)
1170 end subroutine ixgb2
1207 subroutine ix2gb2(lugb, lskip8, idxver, lgrib, cbuf, numfld, mlen, iret)
1212 integer (kind = 8) :: lskip8
1213 integer :: idxver, lgrib
1214 character(len = 1),
pointer,
dimension(:) :: cbuf
1215 integer :: numfld, mlen, iret
1217 character cver, cdisc
1218 character(len = 4) :: ctemp
1219 integer loclus, locgds, locbms
1220 integer :: indbmp, numsec, next, newsize, g2_mova2i, mbuf, lindex
1221 integer :: linmax, ixskp
1222 integer :: mxspd, mxskp, mxsgd, mxsdr, mxsbm, mxlus
1223 integer :: mxlen, mxds, mxfld, mxbms
1224 integer :: init, ixlus, lskip
1225 integer :: ixsgd, ilndrs, ilnpds, istat, ixds
1226 integer (kind = 8) :: ibread8, lbread8, ibskip8, lengds8
1227 integer (kind = 8) :: ilnpds8, ilndrs8
1228 integer :: ixspd, ixfld, ixids, ixlen, ixsbm, ixsdr
1229 integer :: lensec, lensec1
1230 parameter(linmax = 5000, init = 50000, next = 10000)
1231 parameter(ixskp = 4, ixlus = 8, ixsgd = 12, ixspd = 16, ixsdr = 20, ixsbm = 24, &
1232 ixds = 28, ixlen = 36, ixfld = 42, ixids = 44)
1233 parameter(mxskp = 4, mxlus = 4, mxsgd = 4, mxspd = 4, mxsdr = 4, mxsbm = 4, &
1234 mxds = 4, mxlen = 4, mxfld = 2, mxbms = 6)
1235 character cbread(linmax), cindex(linmax)
1236 character cids(linmax), cgds(linmax)
1237 integer :: INT1_BITS, INT2_BITS, INT4_BITS, INT8_BITS
1238 parameter(int1_bits = 8, int2_bits = 16, int4_bits = 32, int8_bits = 64)
1239 integer :: mypos, inc
1241 if (idxver .eq. 1)
then
1255 allocate(cbuf(mbuf), stat = istat)
1256 if (istat .ne. 0)
then
1262 ibread8 = min(lgrib, linmax)
1263 call bareadl(lugb, lskip8, ibread8, lbread8, cbread)
1264 if (lbread8 .ne. ibread8)
then
1268 if(cbread(8) .ne. char(2))
then
1274 call g2_gbytec(cbread, lensec1, 16 * 8, int4_bits)
1275 lensec1 = min(lensec1, int(ibread8, kind(lensec1)))
1276 cids(1:lensec1) = cbread(17:16 + lensec1)
1277 ibskip8 = lskip8 + 16_8 + int(lensec1, kind(8))
1280 ibread8 = max(5, mxbms)
1282 call bareadl(lugb, ibskip8, ibread8, lbread8, cbread)
1283 ctemp = cbread(1)//cbread(2)//cbread(3)//cbread(4)
1284 if (ctemp .eq.
'7777')
return
1285 if (lbread8 .ne. ibread8)
then
1289 call g2_gbytec(cbread, lensec, 0, int4_bits)
1290 call g2_gbytec(cbread, numsec, int4_bits, int1_bits)
1292 if (numsec .eq. 2)
then
1293 loclus = int(ibskip8 - lskip8, kind(4))
1294 elseif (numsec .eq. 3)
then
1297 call bareadl(lugb, ibskip8, lengds8, lbread8, cgds)
1298 if (lbread8 .ne. lengds8)
then
1302 locgds = int(ibskip8 - lskip8, kind(4))
1303 elseif (numsec .eq. 4)
then
1306 if (idxver .eq. 1)
then
1307 lskip = int(lskip8, kind(4))
1308 call g2_sbytec(cindex, lskip, mypos, int4_bits)
1309 mypos = mypos + int4_bits
1311 call g2_sbytec8(cindex, lskip8, mypos, int8_bits)
1312 mypos = mypos + int8_bits
1314 call g2_sbytec(cindex, loclus, mypos, int4_bits)
1315 mypos = mypos + int4_bits
1316 call g2_sbytec(cindex, locgds, mypos, int4_bits)
1317 mypos = mypos + int4_bits
1318 call g2_sbytec(cindex, int(ibskip8 - lskip8, kind(4)), mypos, int4_bits)
1319 mypos = mypos + int4_bits * 4
1320 call g2_sbytec(cindex, lgrib, mypos, int8_bits)
1321 mypos = mypos + int8_bits
1322 cindex((mypos / 8) + 1) = cver
1323 mypos = mypos + int1_bits
1324 cindex((mypos / 8) + 1) = cdisc
1325 mypos = mypos + int1_bits
1326 call g2_sbytec(cindex, numfld + 1, mypos, int2_bits)
1327 mypos = mypos + int2_bits
1328 cindex(ixids + 1 + inc:ixids + lensec1 + inc) = cids(1:lensec1)
1329 lindex = ixids + lensec1 + inc
1330 cindex(lindex + 1:lindex + lengds8) = cgds(1:lengds8)
1331 lindex = lindex + int(lengds8, kind(lindex))
1334 call bareadl(lugb, ibskip8, ilnpds8, lbread8, cindex(lindex + 1))
1335 if (lbread8 .ne. ilnpds8)
then
1339 lindex = lindex + ilnpds
1340 elseif (numsec .eq. 5)
then
1341 mypos = (ixsdr + inc) * int1_bits
1342 call g2_sbytec(cindex, int(ibskip8 - lskip8, kind(4)), mypos, int4_bits)
1345 call bareadl(lugb, ibskip8, ilndrs8, lbread8, cindex(lindex + 1))
1346 if (lbread8 .ne. ilndrs8)
then
1350 lindex = lindex + ilndrs
1351 elseif (numsec .eq. 6)
then
1352 indbmp = g2_mova2i(cbread(6))
1353 mypos = (ixsbm + inc) * int1_bits
1354 if (indbmp.lt.254)
then
1355 locbms = int(ibskip8 - lskip8, kind(4))
1356 call g2_sbytec(cindex, locbms, mypos, int4_bits)
1357 elseif (indbmp.eq.254)
then
1358 call g2_sbytec(cindex, locbms, mypos, int4_bits)
1359 elseif (indbmp.eq.255)
then
1360 call g2_sbytec(cindex, int(ibskip8 - lskip8, kind(4)), mypos, int4_bits)
1362 cindex(lindex + 1:lindex + mxbms) = cbread(1:mxbms)
1363 lindex = lindex + mxbms
1364 call g2_sbytec(cindex, lindex, 0, int4_bits)
1365 elseif (numsec .eq. 7)
then
1366 mypos = (ixds + inc) * int1_bits
1367 call g2_sbytec(cindex, int(ibskip8 - lskip8, kind(4)), mypos, int4_bits)
1369 if ((lindex + mlen) .gt. mbuf)
then
1370 newsize = max(mbuf + next, mbuf + lindex)
1371 call realloc(cbuf, mlen, newsize, istat)
1372 if (istat .ne. 0)
then
1379 cbuf(mlen + 1:mlen + lindex) = cindex(1:lindex)
1380 mlen = mlen + lindex
1385 ibskip8 = ibskip8 + lensec
1398 integer,
intent(out) :: iret
1399 character(len = 1),
pointer,
dimension(:) :: cindex
1400 integer :: nlen, nnum
1404 subroutine getidx(lugb, lugi, cbuf, nlen, nnum, irgi)
1405 character(len = 1),
pointer,
dimension(:) :: cbuf
1406 integer,
intent(in) :: lugb, lugi
1407 integer,
intent(out) :: nlen, nnum, irgi
1413 call getidx(0, 0, cindex, nlen, nnum, iret)
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_sbytec(out, in, iskip, nbits)
Put one arbitrary sized (up to 32 bits) value from an integer array, into a packed bit string,...
subroutine g2_sbytec8(out, in, iskip, nbits)
Put one arbitrary sized (up to 64 bits) values into a packed bit string, taking the low order bits fr...
subroutine ix2gb2(lugb, lskip8, idxver, lgrib, cbuf, numfld, mlen, iret)
Generate a version 1 or 2 index record for each field in a GRIB2 message.
subroutine g2_create_index(lugb, lugi, idxver, filename, iret)
Create a version 1 or 2 index file for a GRIB2 file.
subroutine getgb2s(cbuf, nlen, nnum, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, k, gfld, lpos, iret)
Find information about a GRIB field from the index and fill a grib_mod::gribfield.
subroutine getidx(lugb, lugi, cindex, nlen, nnum, iret)
Find, read or generate a version 1 GRIB2 index for a GRIB2 file (which must be < 2 GB).
subroutine g2_write_index_headers(lugi, nlen, nnum, idxver, filename)
Write index headers.
subroutine getg2i2r(lugb, msk1, msk2, mnum, idxver, cbuf, nlen, nnum, nmess, iret)
Generate a version 1 or 2 index record for each message in a GRIB2 file.
subroutine getg2ir(lugb, msk1, msk2, mnum, cbuf, nlen, nnum, nmess, iret)
Generate a version 1 index record for each message in a GRIB2 file.
subroutine ixgb2(lugb, lskip, lgrib, cbuf, numfld, mlen, iret)
Generate a version 1 index record for each field in a GRIB2 message.
subroutine getidx2(lugb, lugi, idxver, cindex, nlen, nnum, iret)
Find, read or generate a version 1 or 2 GRIB2 index for a GRIB2 file (which may be > 2 GB).
subroutine gf_finalize(iret)
Free all memory associated with the library.
subroutine getg2i(lugi, cbuf, nlen, nnum, iret)
Read a version 1 index file and return its contents.
subroutine getg2i2(lugi, cbuf, idxver, nlen, nnum, iret)
Read a version 1 or 2 index file and return its contents.
subroutine getgb2s2(cbuf, idxver, nlen, nnum, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, k, gfld, lpos, iret)
Find information about a GRIB field from the index and fill a grib_mod::gribfield.
subroutine gf_unpack1(cgrib, lcgrib, iofst, ids, idslen, ierr)
Unpack Section 1 (Identification Section) of a GRIB2 message, starting at octet 6 of that Section.
subroutine gf_unpack5(cgrib, lcgrib, iofst, ndpts, idrsnum, idrstmpl, mapdrslen, ierr)
Unpack Section 5 (Data Representation Section) of a GRIB2 message, starting at octet 6 of that Sectio...
subroutine gf_unpack4(cgrib, lcgrib, iofst, ipdsnum, ipdstmpl, mappdslen, coordlist, numcoord, ierr)
Unpack Section 4 (Product Definition Section) of a GRIB2 message, starting at octet 6 of that Section...
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.
This Fortran module contains the declaration of derived type gribfield.
Reallocate memory, preserving contents.
subroutine skgb8(lugb, iseek8, mseek8, lskip8, lgrib8)
Search a file for the next GRIB1 or GRIB2 message.