62 subroutine getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
63 unpack, k, gfld, iret)
67 integer,
intent(in) :: lugb, lugi, j, jdisc
68 integer,
dimension(:) :: jids(*)
69 integer,
intent(in) :: jpdtn
70 integer,
dimension(:) :: jpdt(*)
71 integer,
intent(in) :: jgdtn
72 integer,
dimension(:) :: jgdt(*)
73 logical,
intent(in) :: unpack
74 integer,
intent(out) :: k
76 integer,
intent(out) ::iret
79 call getgb2i2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
80 unpack, idxver, k, gfld, iret)
191 subroutine getgb2i2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
192 unpack, idxver, k, gfld, iret)
196 integer,
intent(in) :: lugb, lugi, j, jdisc
197 integer,
dimension(:) :: jids(*)
198 integer,
intent(in) :: jpdtn
199 integer,
dimension(:) :: jpdt(*)
200 integer,
intent(in) :: jgdtn
201 integer,
dimension(:) :: jgdt(*)
202 logical,
intent(in) :: unpack
203 integer,
intent(in) :: idxver
204 integer,
intent(out) :: k
206 integer,
intent(out) ::iret
207 character(len = 1),
pointer,
dimension(:) :: cbuf
208 integer :: nnum, nlen, lpos, jk, irgi, irgs
212 subroutine getidx2(lugb, lugi, idxver, cindex, nlen, nnum, iret)
213 integer,
intent(in) :: lugb, lugi, idxver
214 character(len = 1),
pointer,
dimension(:) :: cindex
215 integer,
intent(out) :: nlen, nnum, iret
217 subroutine getgb2s2(cbuf, idxver, nlen, nnum, j, jdisc, jids, jpdtn, jpdt, jgdtn, &
218 jgdt, k, gfld, lpos, iret)
220 character(len = 1),
intent(in) :: cbuf(nlen)
221 integer,
intent(in) :: idxver, nlen, nnum, j, jdisc
222 integer,
dimension(:) :: jids(*)
223 integer,
intent(in) :: jpdtn
224 integer,
dimension(:) :: jpdt(*)
225 integer,
intent(in) :: jgdtn
226 integer,
dimension(:) :: jgdt(*)
227 integer,
intent(out) :: k
229 integer,
intent(out) :: lpos, iret
231 subroutine getgb2l2(lugb, idxver, cindex, gfld, iret)
233 integer,
intent(in) :: lugb, idxver
234 character(len = 1),
intent(in) :: cindex(*)
236 integer,
intent(out) :: iret
238 subroutine getgb2r2(lugb, idxver, cindex, gfld, iret)
241 integer,
intent(in) :: lugb, idxver
242 character(len=1),
intent(in) :: cindex(*)
244 integer,
intent(out) :: iret
252 call getidx2(lugb, lugi, idxver, cbuf, nlen, nnum, irgi)
253 if (irgi .gt. 1)
then
260 call getgb2s2(cbuf, idxver, nlen, nnum, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, jk, &
262 if (irgs .ne. 0)
then
269 call getgb2l2(lugb, idxver, cbuf(lpos), gfld, iret)
273 call getgb2r2(lugb, idxver, cbuf(lpos), gfld, iret)
306 integer,
intent(in) :: lugb
307 character(len = 1),
intent(in) :: cindex(*)
309 integer,
intent(out) :: iret
312 subroutine getgb2l2(lugb, idxver, cindex, gfld, iret)
314 integer,
intent(in) :: lugb, idxver
315 character(len = 1),
intent(in) :: cindex(*)
317 integer,
intent(out) :: iret
321 call getgb2l2(lugb, 1, cindex, gfld, iret)
350 subroutine getgb2l2(lugb, idxver, cindex, gfld, iret)
354 integer,
intent(in) :: lugb, idxver
355 character(len = 1),
intent(in) :: cindex(*)
357 integer,
intent(out) :: iret
359 integer :: lskip, skip2
360 integer (kind = 8) :: lskip8, iskip8, lread8, ilen8
361 character(len = 1):: csize(4)
362 character(len = 1),
allocatable :: ctemp(:)
363 integer :: ilen, iofst, ierr
364 integer :: INT1_BITS, INT2_BITS, INT4_BITS, INT8_BITS
365 parameter(int1_bits = 8, int2_bits = 16, int4_bits = 32, int8_bits = 64)
369 subroutine gf_unpack2(cgrib, lcgrib, iofst, lencsec2, csec2, ierr)
370 character(len = 1),
intent(in) :: cgrib(lcgrib)
371 integer,
intent(in) :: lcgrib
372 integer,
intent(inout) :: iofst
373 integer,
intent(out) :: lencsec2
374 integer,
intent(out) :: ierr
375 character(len = 1),
pointer,
dimension(:) :: csec2
383 if (idxver .eq. 1)
then
384 call g2_gbytec(cindex, lskip, mypos, int4_bits)
385 mypos = mypos + int4_bits
388 call g2_gbytec8(cindex, lskip8, mypos, int8_bits)
389 mypos = mypos + int8_bits
391 call g2_gbytec(cindex, skip2, mypos, int4_bits)
394 if (skip2 .ne. 0)
then
395 iskip8 = lskip8 + skip2
398 call bareadl(lugb, iskip8, 4_8, lread8, csize)
400 allocate(ctemp(ilen))
404 call bareadl(lugb, iskip8, ilen8, lread8, ctemp)
405 if (ilen8 .ne. lread8)
then
411 call gf_unpack2(ctemp, ilen, iofst, gfld%locallen, gfld%local, ierr)
412 if (ierr .ne. 0)
then
510 subroutine getgb2p(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
511 extract, k, gribm, leng, iret)
515 integer,
intent(in) :: lugb, lugi, j, jdisc, jpdtn, jgdtn
516 integer,
dimension(:) :: jids(*), jpdt(*), jgdt(*)
517 logical,
intent(in) :: extract
518 integer,
intent(out) :: k, iret, leng
519 character(len = 1),
pointer,
dimension(:) :: gribm
522 integer :: msk1, irgi, irgs, jk, lpos, msk2, mskp, nlen, nmess, nnum
524 character(len = 1),
pointer,
dimension(:) :: cbuf
525 parameter(msk1 = 32000, msk2 = 4000)
529 subroutine getg2i(lugi, cbuf, nlen, nnum, iret)
530 character(len = 1),
pointer,
dimension(:) :: cbuf
531 integer,
intent(in) :: lugi
532 integer,
intent(out) :: nlen, nnum, iret
534 subroutine getg2ir(lugb, msk1, msk2, mnum, cbuf, nlen, nnum, &
536 character(len = 1),
pointer,
dimension(:) :: cbuf
537 integer,
intent(in) :: lugb, msk1, msk2, mnum
538 integer,
intent(out) :: nlen, nnum, nmess, iret
540 subroutine getgb2rp(lugb, cindex, extract, gribm, leng, iret)
541 integer,
intent(in) :: lugb
542 character(len = 1),
intent(in) :: cindex(*)
543 logical,
intent(in) :: extract
544 integer,
intent(out) :: leng, iret
545 character(len = 1),
pointer,
dimension(:) :: gribm
551 if (lugi .gt. 0)
then
552 call getg2i(lugi, cbuf, nlen, nnum, irgi)
553 elseif (lugi .le. 0)
then
555 call getg2ir(lugb, msk1, msk2, mskp, cbuf, nlen, nnum, nmess, irgi)
557 if (irgi .gt. 1)
then
563 call getgb2s(cbuf, nlen, nnum, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
564 jk, gfld, lpos, irgs)
565 if (irgs .ne. 0)
then
573 call getgb2rp(lugb, cbuf(lpos:), extract, gribm, leng, iret)
578 if (
associated(cbuf))
deallocate(cbuf)
621 integer,
intent(in) :: lugb
622 character(len=1),
intent(in) :: cindex(*)
624 integer,
intent(out) :: iret
627 subroutine getgb2r2(lugb, idxver, cindex, gfld, iret)
630 integer,
intent(in) :: lugb, idxver
631 character(len=1),
intent(in) :: cindex(*)
633 integer,
intent(out) :: iret
637 call getgb2r2(lugb, 1, cindex, gfld, iret)
676 subroutine getgb2r2(lugb, idxver, cindex, gfld, iret)
680 integer,
intent(in) :: lugb, idxver
681 character(len=1),
intent(in) :: cindex(*)
683 integer,
intent(out) :: iret
685 integer :: lskip, skip6, skip7
686 character(len=1):: csize(4)
687 character(len=1),
allocatable :: ctemp(:)
688 real,
pointer,
dimension(:) :: newfld
689 integer :: n, j, iskip, iofst, ilen, ierr, idum
691 integer (kind = 8) :: lskip8, lread8, ilen8, iskip8
692 integer :: INT1_BITS, INT2_BITS, INT4_BITS, INT8_BITS
693 parameter(int1_bits = 8, int2_bits = 16, int4_bits = 32, int8_bits = 64)
696 subroutine gf_unpack6(cgrib, lcgrib, iofst, ngpts, ibmap, bmap, ierr)
697 character(len=1),
intent(in) :: cgrib(lcgrib)
698 integer,
intent(in) :: lcgrib, ngpts
699 integer,
intent(inout) :: iofst
700 integer,
intent(out) :: ibmap
701 integer,
intent(out) :: ierr
702 logical*1,
pointer,
dimension(:) :: bmap
704 subroutine gf_unpack7(cgrib, lcgrib, iofst, igdsnum, igdstmpl, &
705 idrsnum, idrstmpl, ndpts, fld, ierr)
706 character(len=1),
intent(in) :: cgrib(lcgrib)
707 integer,
intent(in) :: lcgrib, ndpts, idrsnum, igdsnum
708 integer,
intent(inout) :: iofst
709 integer,
pointer,
dimension(:) :: idrstmpl, igdstmpl
710 integer,
intent(out) :: ierr
711 real,
pointer,
dimension(:) :: fld
716 nullify(gfld%bmap, gfld%fld)
719 if (idxver .eq. 1)
then
720 call g2_gbytec(cindex, lskip, int4_bits, int4_bits)
724 call g2_gbytec8(cindex, lskip8, int4_bits, int8_bits)
725 lskip = int(lskip8, kind(4))
727 call g2_gbytec(cindex, skip6, (24 + inc) * int1_bits, int4_bits)
728 call g2_gbytec(cindex, skip7, (28 + inc) * int1_bits, int4_bits)
731 if (gfld%ibmap .eq. 0 .or. gfld%ibmap .eq. 254)
then
732 iskip = lskip + skip6
733 iskip8 = lskip8 + skip6
736 call bareadl(lugb, iskip8, 4_8, lread8, csize)
738 allocate(ctemp(ilen))
742 call bareadl(lugb, iskip8, ilen8, lread8, ctemp)
743 if (ilen8 .ne. lread8)
then
749 call gf_unpack6(ctemp, ilen, iofst, gfld%ngrdpts, idum, gfld%bmap, ierr)
750 if (ierr .ne. 0)
then
759 iskip = lskip + skip7
760 iskip8 = lskip8 + skip7
763 call bareadl(lugb, iskip8, 4_8, lread8, csize)
765 if (ilen .lt. 6) ilen = 6
766 allocate(ctemp(ilen))
770 call bareadl(lugb, iskip8, ilen8, lread8, ctemp)
771 if (ilen8 .ne. lread8)
then
777 call gf_unpack7(ctemp, ilen, iofst, gfld%igdtnum, gfld%igdtmpl, &
778 gfld%idrtnum, gfld%idrtmpl, gfld%ndpts, gfld%fld, ierr)
779 if (ierr .ne. 0)
then
788 if (gfld%ibmap .ne. 255 .AND.
associated(gfld%bmap))
then
789 allocate(newfld(gfld%ngrdpts))
791 do j = 1, gfld%ngrdpts
792 if (gfld%bmap(j))
then
793 newfld(j) = gfld%fld(n)
799 deallocate(gfld%fld);
801 gfld%expanded = .true.
803 gfld%expanded = .true.
842 subroutine getgb2rp(lugb, cindex, extract, gribm, leng, iret)
845 integer,
intent(in) :: lugb
846 character(len = 1),
intent(in) :: cindex(*)
847 logical,
intent(in) :: extract
848 character(len = 1),
pointer,
dimension(:) :: gribm
849 integer,
intent(out) :: leng, iret
852 subroutine getgb2rp2(lugb, idxver, cindex, extract, gribm, leng, iret)
853 integer,
intent(in) :: lugb, idxver
854 character(len = 1),
intent(in) :: cindex(*)
855 logical,
intent(in) :: extract
856 character(len = 1),
pointer,
dimension(:) :: gribm
857 integer,
intent(out) :: leng, iret
861 call getgb2rp2(lugb, 1, cindex, extract, gribm, leng, iret)
896 subroutine getgb2rp2(lugb, idxver, cindex, extract, gribm, leng, iret)
899 integer,
intent(in) :: lugb, idxver
900 character(len = 1),
intent(in) :: cindex(*)
901 logical,
intent(in) :: extract
902 integer,
intent(out) :: leng, iret
903 character(len = 1),
pointer,
dimension(:) :: gribm
905 integer,
parameter :: zero = 0
906 character(len = 1),
allocatable,
dimension(:) :: csec2, csec6, csec7
907 character(len = 4) :: ctemp
908 integer :: lencur, len0, ibmap = 0, ipos, iskip
909 integer :: len7 = 0, len8 = 0, len3 = 0, len4 = 0, len5 = 0, len6 = 0, len1 = 0, len2 = 0
910 integer :: iskp2, iskp6, iskp7
911 integer :: INT1_BITS, INT2_BITS, INT4_BITS, INT8_BITS
912 parameter(int1_bits = 8, int2_bits = 16, int4_bits = 32, int8_bits = 64)
913 integer :: mypos, inc = 0
914 integer (kind = 8) :: lread8, iskip8, leng8, len2_8, len7_8, len6_8
923 if (idxver .eq. 1)
then
924 call g2_gbytec(cindex, iskip, mypos, int4_bits)
925 mypos = mypos + int4_bits
929 call g2_gbytec8(cindex, iskip8, mypos, int8_bits)
930 mypos = mypos + int8_bits
931 iskip = int(iskip8, kind(4))
933 call g2_gbytec(cindex, iskp2, mypos, int4_bits)
934 mypos = mypos + int4_bits
935 if (iskp2 .gt. 0)
then
936 call bareadl(lugb, iskip8 + iskp2, 4_8, lread8, ctemp)
937 call g2_gbytec(ctemp, len2, 0, int4_bits)
938 allocate(csec2(len2))
940 call bareadl(lugb, iskip8 + iskp2, len2_8, lread8, csec2)
944 mypos = mypos + 32 * int1_bits
945 call g2_gbytec(cindex, len1, mypos, int4_bits)
947 mypos = mypos + len1 * int1_bits
948 call g2_gbytec(cindex, len3, mypos, int4_bits)
950 mypos = mypos + len3 * int1_bits
951 call g2_gbytec(cindex, len4, mypos, int4_bits)
953 mypos = mypos + len4 * int1_bits
954 call g2_gbytec(cindex, len5, mypos, int4_bits)
956 mypos = mypos + len5 * int1_bits
957 call g2_gbytec(cindex, len6, mypos, int4_bits)
959 mypos = mypos + len6 * int1_bits
960 call g2_gbytec(cindex, ibmap, mypos, int1_bits)
961 if (ibmap .eq. 254)
then
962 call g2_gbytec(cindex, iskp6, (24 + inc) * int1_bits, int4_bits)
964 call bareadl(lugb, iskip8 + iskp6, 4_8, lread8, ctemp)
965 call g2_gbytec(ctemp, len6, 0, int4_bits)
969 call g2_gbytec(cindex, iskp7, (28 + inc) * int1_bits, int4_bits)
971 call bareadl(lugb, iskip8 + iskp7, 4_8, lread8, ctemp)
972 call g2_gbytec(ctemp, len7, 0, int4_bits)
973 allocate(csec7(len7))
976 call bareadl(lugb, iskip8 + iskp7, len7_8, lread8, csec7)
978 leng = len0 + len1 + len2 + len3 + len4 + len5 + len6 + len7 + len8
979 if (.not.
associated(gribm))
allocate(gribm(leng))
988 gribm(7) = cindex(42 + inc)
989 gribm(8) = cindex(41 + inc)
994 call g2_sbytec(gribm, leng, 12*8, int4_bits)
997 gribm(17:16 + len1) = cindex(45 + inc:44 + inc + len1)
998 lencur = 16 + inc + len1
999 ipos = 44 + inc + len1
1002 if (iskp2 .gt. 0)
then
1003 gribm(lencur + 1:lencur + len2) = csec2(1:len2)
1004 lencur = lencur + len2
1008 gribm(lencur + 1:lencur + len3 + len4 + len5) = cindex(ipos + 1:ipos + len3 + len4 + len5)
1009 lencur = lencur + len3 + len4 + len5
1010 ipos = ipos + len3 + len4 + len5
1013 if (len6 .eq. 6 .and. ibmap .ne. 254)
then
1014 gribm(lencur + 1:lencur + len6) = cindex(ipos + 1:ipos + len6)
1015 lencur = lencur + len6
1017 call g2_gbytec(cindex, iskp6, (24 + inc) * 8, int4_bits)
1018 call bareadl(lugb, iskip8 + iskp6, 4_8, lread8, ctemp)
1019 call g2_gbytec(ctemp, len6, 0, int4_bits)
1020 allocate(csec6(len6))
1022 call bareadl(lugb, iskip8 + iskp6, len6_8, lread8, csec6)
1023 gribm(lencur + 1:lencur + len6) = csec6(1:len6)
1024 lencur = lencur + len6
1025 if (
allocated(csec6))
deallocate(csec6)
1029 gribm(lencur + 1:lencur + len7) = csec7(1:len7)
1030 lencur = lencur + len7
1033 gribm(lencur + 1) =
'7'
1034 gribm(lencur + 2) =
'7'
1035 gribm(lencur + 3) =
'7'
1036 gribm(lencur + 4) =
'7'
1039 if (
allocated(csec2))
deallocate(csec2)
1040 if (
allocated(csec7))
deallocate(csec7)
1042 if (idxver .eq. 1)
then
1043 call g2_gbytec(cindex, iskip, mypos, int4_bits)
1044 mypos = mypos + int4_bits
1047 call g2_gbytec8(cindex, iskip8, mypos, int8_bits)
1048 mypos = mypos + int8_bits
1050 mypos = mypos + 7 * int4_bits
1051 call g2_gbytec(cindex, leng, mypos, int4_bits)
1052 if (.not.
associated(gribm))
allocate(gribm(leng))
1054 call bareadl(lugb, iskip8, leng8, lread8, gribm)
1055 if (leng8 .ne. lread8)
then
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_gbytec8(in, iout, iskip, nbits)
Extract one arbitrary sized (up to 64-bits) values from a packed bit string, right justifying each va...
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 getgb2i2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, unpack, idxver, k, gfld, iret)
Find and unpack a GRIB2 message in a file, using an version 1 or 2 index record which is either found...
subroutine getgb2l2(lugb, idxver, cindex, gfld, iret)
Read and unpack a local use section from a GRIB2 index record (index format 1 or 2) and GRIB2 file.
subroutine getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, unpack, k, gfld, iret)
This is a legacy version of getgb2i2().
subroutine getgb2r2(lugb, idxver, cindex, gfld, iret)
Read and unpack sections 6 and 7 from a GRIB2 message using a version 1 or version 2 index record.
subroutine getgb2rp(lugb, cindex, extract, gribm, leng, iret)
Extract a grib message from a file given the index (index format 1) of the requested field.
subroutine getgb2l(lugb, cindex, gfld, iret)
Read and unpack a local use section from a GRIB2 index record (index format 1) and GRIB2 file.
subroutine getgb2rp2(lugb, idxver, cindex, extract, gribm, leng, iret)
Extract a grib message from a file given the version 1 or 2 index of the requested field.
subroutine getgb2r(lugb, cindex, gfld, iret)
Read and unpack sections 6 and 7 from a GRIB2 message using a version 1 index record.
subroutine getgb2p(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, extract, k, gribm, leng, iret)
Find and extract a GRIB2 message from a file.
subroutine gf_free(gfld)
Free memory that was used to store array values in derived type grib_mod::gribfield.
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 getg2ir(lugb, msk1, msk2, mnum, cbuf, nlen, nnum, nmess, iret)
Generate a version 1 index record for each message in a GRIB2 file.
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 getg2i(lugi, cbuf, nlen, nnum, iret)
Read a version 1 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_unpack2(cgrib, lcgrib, iofst, lencsec2, csec2, ierr)
Unpack Section 2 (Local Use Section) of a GRIB2 message.
subroutine gf_unpack7(cgrib, lcgrib, iofst, igdsnum, igdstmpl, idrsnum, idrstmpl, ndpts, fld, ierr)
Unpack Section 7 (Data Section) of a GRIB2 message.
subroutine gf_unpack6(cgrib, lcgrib, iofst, ngpts, ibmap, bmap, ierr)
Unpack Section 6 (Bit-Map Section) of a GRIB2 message, starting at octet 6 of that Section.
This Fortran module contains the declaration of derived type gribfield.