55 SUBROUTINE ixgb2(LUGB, LSKIP, LGRIB, CBUF, NUMFLD, MLEN, IRET)
59 CHARACTER(LEN = 1),
POINTER,
DIMENSION(:) :: CBUF
61 CHARACTER(LEN = 4) :: CTEMP
62 INTEGER LOCLUS, LOCGDS, LENGDS, LOCBMS
63 integer :: indbmp, numsec, next, newsize, mova2i, mbuf, lindex
64 integer :: linmax, ixskp
65 integer :: mxspd, mxskp, mxsgd, mxsdr, mxsbm, mxlus
66 integer :: mxlen, mxds, mxfld, mxbms
67 integer :: init, ixlus, lugb, lskip, lgrib, numfld, mlen, iret
68 integer :: ixsgd, ibread, ibskip, ilndrs, ilnpds, istat, ixds
69 integer :: ixspd, ixfld, ixids, ixlen, ixsbm, ixsdr
70 integer :: lbread, lensec, lensec1
71 parameter(linmax = 5000, init = 50000, next = 10000)
72 parameter(ixskp = 4, ixlus = 8, ixsgd = 12, ixspd = 16, ixsdr = 20, ixsbm = 24, &
73 ixds = 28, ixlen = 36, ixfld = 42, ixids = 44)
74 parameter(mxskp = 4, mxlus = 4, mxsgd = 4, mxspd = 4, mxsdr = 4, mxsbm = 4, &
75 mxds = 4, mxlen = 4, mxfld = 2, mxbms = 6)
76 CHARACTER CBREAD(LINMAX), CINDEX(LINMAX)
77 CHARACTER CIDS(LINMAX), CGDS(LINMAX)
85 ALLOCATE(cbuf(mbuf), stat = istat)
86 IF (istat .NE. 0)
THEN
92 ibread = min(lgrib, linmax)
93 CALL baread(lugb, lskip, ibread, lbread, cbread)
94 IF(lbread .NE. ibread)
THEN
98 IF(cbread(8) .NE. char(2))
THEN
104 CALL g2_gbytec(cbread, lensec1, 16 * 8, 4 * 8)
105 lensec1 = min(lensec1, ibread)
106 cids(1:lensec1) = cbread(17:16 + lensec1)
107 ibskip = lskip + 16 + lensec1
110 ibread = max(5, mxbms)
112 CALL baread(lugb, ibskip, ibread, lbread, cbread)
113 ctemp = cbread(1)//cbread(2)//cbread(3)//cbread(4)
114 IF (ctemp .EQ.
'7777')
RETURN
115 IF(lbread .NE. ibread)
THEN
119 CALL g2_gbytec(cbread, lensec, 0 * 8, 4 * 8)
120 CALL g2_gbytec(cbread, numsec, 4 * 8, 1 * 8)
122 IF (numsec .EQ. 2)
THEN
123 loclus = ibskip-lskip
124 ELSEIF (numsec .EQ. 3)
THEN
127 CALL baread(lugb, ibskip, lengds, lbread, cgds)
128 IF (lbread .NE. lengds)
THEN
132 locgds = ibskip-lskip
133 ELSEIF (numsec .EQ. 4)
THEN
135 CALL g2_sbytec(cindex, lskip, 8 * ixskp, 8 * mxskp)
136 CALL g2_sbytec(cindex, loclus, 8 * ixlus, 8 * mxlus)
137 CALL g2_sbytec(cindex, locgds, 8 * ixsgd, 8 * mxsgd)
138 CALL g2_sbytec(cindex, ibskip-lskip, 8 * ixspd, 8 * mxspd)
139 CALL g2_sbytec(cindex, lgrib, 8 * ixlen, 8 * mxlen)
142 CALL g2_sbytec(cindex, numfld + 1, 8 * ixfld, 8 * mxfld)
143 cindex(ixids + 1:ixids + lensec1) = cids(1:lensec1)
144 lindex = ixids + lensec1
145 cindex(lindex + 1:lindex + lengds) = cgds(1:lengds)
146 lindex = lindex + lengds
148 CALL baread(lugb, ibskip, ilnpds, lbread, cindex(lindex + 1))
149 IF (lbread .NE. ilnpds)
THEN
153 lindex = lindex + ilnpds
154 ELSEIF (numsec .EQ. 5)
THEN
155 CALL g2_sbytec(cindex, ibskip-lskip, 8 * ixsdr, 8 * mxsdr)
157 CALL baread(lugb, ibskip, ilndrs, lbread, cindex(lindex + 1))
158 IF (lbread .NE. ilndrs)
THEN
162 lindex = lindex + ilndrs
163 ELSEIF (numsec .EQ. 6)
THEN
164 indbmp = mova2i(cbread(6))
165 IF (indbmp.LT.254)
THEN
166 locbms = ibskip-lskip
167 CALL g2_sbytec(cindex, locbms, 8 * ixsbm, 8 * mxsbm)
168 ELSEIF (indbmp.EQ.254)
THEN
169 CALL g2_sbytec(cindex, locbms, 8 * ixsbm, 8 * mxsbm)
170 ELSEIF (indbmp.EQ.255)
THEN
171 CALL g2_sbytec(cindex, ibskip-lskip, 8 * ixsbm, 8 * mxsbm)
173 cindex(lindex + 1:lindex + mxbms) = cbread(1:mxbms)
174 lindex = lindex + mxbms
176 ELSEIF (numsec .EQ. 7)
THEN
177 CALL g2_sbytec(cindex, ibskip-lskip, 8 * ixds, 8 * mxds)
179 IF ((lindex + mlen) .GT. mbuf)
THEN
180 newsize = max(mbuf + next, mbuf + lindex)
181 CALL realloc(cbuf, mlen, newsize, istat)
182 IF (istat .NE. 0)
THEN
189 cbuf(mlen + 1:mlen + lindex) = cindex(1:lindex)
195 ibskip = ibskip + lensec
subroutine g2_gbytec(in, iout, iskip, nbits)
Extract arbitrary size values from a packed bit string, right justifying each value in the unpacked a...
subroutine g2_sbytec(out, in, iskip, nbits)
Put arbitrary size values into a packed bit string, taking the low order bits from each value in the ...
subroutine ixgb2(LUGB, LSKIP, LGRIB, CBUF, NUMFLD, MLEN, IRET)
Generate an index record for each field in a GRIB2 message.
Reallocate memory, preserving contents.