From 2da05fecc680ee47129a4e5b2133b524a5c9117b Mon Sep 17 00:00:00 2001 From: Ed Date: Tue, 13 Feb 2024 09:22:06 -0700 Subject: [PATCH] rolled back some changes --- src/getgb2rp.F90 | 256 +++++++++++++++++------------------------------ 1 file changed, 93 insertions(+), 163 deletions(-) diff --git a/src/getgb2rp.F90 b/src/getgb2rp.F90 index 8c70e8a5..10dfaf86 100644 --- a/src/getgb2rp.F90 +++ b/src/getgb2rp.F90 @@ -3,11 +3,8 @@ !> field. !> @author Stephen Gilbert @date 2003-12-31 -!> Extract a grib message from a file given the index (index format 1) -!> of the requested field. -!> -!> This subroutine is maintained for backward compatibility. New code -!> should use getgb2rp2(). +!> Extract a grib message from a file given the index of the requested +!> field. !> !> The GRIB message returned can contain only the requested field !> (extract=.true.), or the complete GRIB message originally @@ -25,7 +22,7 @@ !> (https://noaa-emc.github.io/NCEPLIBS-bacio/) before calling this !> routine. !> @param[in] cindex Index record of the grib field (see docunentation of -!> subroutine ix2gb2() for description of an index record.) +!> subroutine ixgb2() for description of an index record.) !> @param[in] extract Logical value indicating whether to return a !> GRIB2 message with just the requested field, or the entire !> GRIB2 message containing the requested field. @@ -37,69 +34,15 @@ !> - 0 No error. !> - 97 Error reading grib file. !> -!> @author Stephen Gilbert, Ed Hartnett @date 2003-12-31 +!> @author Stephen Gilbert @date 2003-12-31 subroutine getgb2rp(lugb, cindex, extract, gribm, leng, iret) implicit none integer, intent(in) :: lugb character(len = 1), intent(in) :: cindex(*) logical, intent(in) :: extract - character(len = 1), pointer, dimension(:) :: gribm integer, intent(out) :: leng, iret - - interface - subroutine getgb2rp2(lugb, idxver, cindex, extract, gribm, leng, iret) - integer, intent(in) :: lugb, idxver - character(len = 1), intent(in) :: cindex(*) - logical, intent(in) :: extract - character(len = 1), pointer, dimension(:) :: gribm - integer, intent(out) :: leng, iret - end subroutine getgb2rp2 - end interface - - call getgb2rp2(lugb, 1, cindex, extract, gribm, leng, iret) - -end subroutine getgb2rp - -!> Extract a grib message from a file given the version 1 or 2 index -!> of the requested field. -!> -!> The GRIB message returned can contain only the requested field -!> (extract=.true.), or the complete GRIB message originally -!> containing the desired field can be returned (extract=.false.) even -!> if other fields were included in the GRIB message. -!> -!> If the GRIB field is not found, then the return code will be -!> nonzero. -!> -!> @param[in] lugb integer unit of the unblocked grib data file. file -!> must be opened with [baopen() or baopenr()] -!> (https://noaa-emc.github.io/NCEPLIBS-bacio/) before calling this -!> routine. -!> @param[in] idxver Version of index, use 1 for legacy, 2 if files -!> may be > 2 GB. -!> @param[in] cindex Index record of the grib field (see docunentation of -!> subroutine ixgb2() for description of an index record.) -!> @param[in] extract Logical value indicating whether to return a -!> GRIB2 message with just the requested field, or the entire -!> GRIB2 message containing the requested field. -!> - .true. = return grib2 message containing only the requested field. -!> - .false. = return entire grib2 message containing the requested field. -!> @param[out] gribm Returned grib message. -!> @param[out] leng Length of returned grib message in bytes. -!> @param[out] iret Return code: -!> - 0 No error. -!> - 97 Error reading grib file. -!> -!> @author Edward Hartnett, Stephen Gilbert @date Feb 13, 2024 -subroutine getgb2rp2(lugb, idxver, cindex, extract, gribm, leng, iret) - implicit none - - integer, intent(in) :: lugb, idxver - character(len = 1), intent(in) :: cindex(*) - logical, intent(in) :: extract character(len = 1), pointer, dimension(:) :: gribm - integer, intent(out) :: leng, iret integer, parameter :: zero = 0 character(len = 1), allocatable, dimension(:) :: csec2, csec6, csec7 @@ -107,132 +50,119 @@ subroutine getgb2rp2(lugb, idxver, cindex, extract, gribm, leng, iret) integer :: lencur, lread, len0, ibmap, ipos, iskip integer :: len7, len8, len3, len4, len5, len6, len1, len2 integer :: iskp2, iskp6, iskp7 - integer :: mypos - integer (kind = 8) :: iskip8, lread8, len2_8 - integer :: INT1_BITS, INT2_BITS, INT4_BITS, INT8_BITS - parameter(INT1_BITS = 8, INT2_BITS = 16, INT4_BITS = 32, INT8_BITS = 64) iret = 0 ! Extract grib message from file. - if (extract) then - len0 = 16 - len8 = 4 - if (idxver .eq. 1) then - call g2_gbytec(cindex, iskip, INT4_BITS, INT4_BITS) ! bytes to skip in file - mypos = INT4_BITS + INT4_BITS - else - call g2_gbytec8(cindex, iskip8, INT4_BITS, INT8_BITS) ! bytes to skip in file - mypos = INT4_BITS + INT8_BITS - iskip = int(iskip8, kind(4)) - endif - call g2_gbytec(cindex, iskp2, mypos, INT4_BITS) ! bytes to skip for section 2 + IF (EXTRACT) THEN + LEN0 = 16 + LEN8 = 4 + CALL G2_GBYTEC(CINDEX, ISKIP, 4*8, 4*8) ! BYTES TO SKIP IN FILE + CALL G2_GBYTEC(CINDEX, ISKP2, 8*8, 4*8) ! BYTES TO SKIP FOR section 2 if (iskp2 .gt. 0) then - call bareadl(lugb, int(iskip + iskp2, kind(8)), 4_8, lread8, ctemp) - call g2_gbytec(ctemp, len2, 0, INT4_BITS) ! length of section 2 - allocate(csec2(len2)) - len2_8 = len2 - call bareadl(lugb, int(iskip + iskp2, kind(8)), len2_8, lread8, csec2) + CALL BAREAD(LUGB, ISKIP + ISKP2, 4, LREAD, ctemp) + CALL G2_GBYTEC(Ctemp, LEN2, 0, 4*8) ! LENGTH OF SECTION 2 + ALLOCATE(csec2(len2)) + CALL BAREAD(LUGB, ISKIP + ISKP2, LEN2, LREAD, csec2) else - len2 = 0 + LEN2 = 0 endif - call g2_gbytec(cindex, len1, 44*8, INT4_BITS) ! length of section 1 - ipos = 44 + len1 - call g2_gbytec(cindex, len3, ipos*8, INT4_BITS) ! length of section 3 - ipos = ipos + len3 - call g2_gbytec(cindex, len4, ipos*8, INT4_BITS) ! length of section 4 - ipos = ipos + len4 - call g2_gbytec(cindex, len5, ipos*8, INT4_BITS) ! length of section 5 - ipos = ipos + len5 - call g2_gbytec(cindex, len6, ipos*8, INT4_BITS) ! length of section 6 - ipos = ipos + 5 - call g2_gbytec(cindex, ibmap, ipos*8, 1*8) ! bitmap indicator - if (ibmap .eq. 254) then - call g2_gbytec(cindex, iskp6, 24*8, INT4_BITS) ! bytes to skip for section 6 - call bareadl(lugb, int(iskip + iskp6, kind(8)), 4_8, lread8, ctemp) - call g2_gbytec(ctemp, len6, 0, INT4_BITS) ! length of section 6 - endif - - ! Read in section 7 from file. - call g2_gbytec(cindex, iskp7, 28*8, INT4_BITS) ! bytes to skip for section 7 - call bareadl(lugb, int(iskip + iskp7, kind(8)), 4_8, lread8, ctemp) - call g2_gbytec(ctemp, len7, 0, INT4_BITS) ! length of section 7 - allocate(csec7(len7)) - !call baread(lugb, iskip + iskp7, len7, lread, csec7) - call bareadl(lugb, int(iskip + iskp7, kind(8)), int(len7, kind(8)), lread8, csec7) - - leng = len0 + len1 + len2 + len3 + len4 + len5 + len6 + len7 + len8 - if (.not. associated(gribm)) allocate(gribm(leng)) + CALL G2_GBYTEC(CINDEX, LEN1, 44*8, 4*8) ! LENGTH OF SECTION 1 + IPOS = 44 + LEN1 + CALL G2_GBYTEC(CINDEX, LEN3, IPOS*8, 4*8) ! LENGTH OF SECTION 3 + IPOS = IPOS + LEN3 + CALL G2_GBYTEC(CINDEX, LEN4, IPOS*8, 4*8) ! LENGTH OF SECTION 4 + IPOS = IPOS + LEN4 + CALL G2_GBYTEC(CINDEX, LEN5, IPOS*8, 4*8) ! LENGTH OF SECTION 5 + IPOS = IPOS + LEN5 + CALL G2_GBYTEC(CINDEX, LEN6, IPOS*8, 4*8) ! LENGTH OF SECTION 6 + IPOS = IPOS + 5 + CALL G2_GBYTEC(CINDEX, IBMAP, IPOS*8, 1*8) ! Bitmap indicator + IF (IBMAP .eq. 254) THEN + CALL G2_GBYTEC(CINDEX, ISKP6, 24*8, 4*8) ! BYTES TO SKIP FOR section 6 + CALL BAREAD(LUGB, ISKIP + ISKP6, 4, LREAD, ctemp) + CALL G2_GBYTEC(Ctemp, LEN6, 0, 4*8) ! LENGTH OF SECTION 6 + ENDIF + + ! READ IN SECTION 7 from file + CALL G2_GBYTEC(CINDEX, ISKP7, 28*8, 4*8) ! BYTES TO SKIP FOR section 7 + CALL BAREAD(LUGB, ISKIP + ISKP7, 4, LREAD, ctemp) + CALL G2_GBYTEC(Ctemp, LEN7, 0, 4*8) ! LENGTH OF SECTION 7 + ALLOCATE(csec7(len7)) + CALL BAREAD(LUGB, ISKIP + ISKP7, LEN7, LREAD, csec7) + + LENG = LEN0 + LEN1 + LEN2 + LEN3 + LEN4 + LEN5 + LEN6 + LEN7 + LEN8 + IF (.NOT. ASSOCIATED(GRIBM)) ALLOCATE(GRIBM(LENG)) ! Create Section 0 - gribm(1) = 'G' - gribm(2) = 'R' - gribm(3) = 'I' - gribm(4) = 'B' - gribm(5) = char(0) - gribm(6) = char(0) - gribm(7) = cindex(42) - gribm(8) = cindex(41) - gribm(9) = char(0) - gribm(10) = char(0) - gribm(11) = char(0) - gribm(12) = char(0) - call g2_sbytec(gribm, leng, 12*8, INT4_BITS) + GRIBM(1) = 'G' + GRIBM(2) = 'R' + GRIBM(3) = 'I' + GRIBM(4) = 'B' + GRIBM(5) = CHAR(0) + GRIBM(6) = CHAR(0) + GRIBM(7) = CINDEX(42) + GRIBM(8) = CINDEX(41) + GRIBM(9) = CHAR(0) + GRIBM(10) = CHAR(0) + GRIBM(11) = CHAR(0) + GRIBM(12) = CHAR(0) + CALL G2_SBYTEC(GRIBM, LENG, 12*8, 4*8) ! Copy Section 1 - gribm(17:16 + len1) = cindex(45:44 + len1) - lencur = 16 + len1 + GRIBM(17:16 + LEN1) = CINDEX(45:44 + LEN1) + lencur = 16 + LEN1 ipos = 44 + len1 - ! copy section 2, if necessary + ! Copy Section 2, if necessary if (iskp2 .gt. 0) then - gribm(lencur + 1:lencur + len2) = csec2(1:len2) - lencur = lencur + len2 + GRIBM(lencur + 1:lencur + LEN2) = csec2(1:LEN2) + lencur = lencur + LEN2 endif ! Copy Sections 3 through 5 - gribm(lencur + 1:lencur + len3 + len4 + len5) = cindex(ipos + 1:ipos + len3 + len4 + len5) - lencur = lencur + len3 + len4 + len5 - ipos = ipos + len3 + len4 + len5 + GRIBM(lencur + 1:lencur + LEN3 + LEN4 + LEN5) = CINDEX(ipos + 1:ipos + LEN3 + LEN4 + LEN5) + lencur = lencur + LEN3 + LEN4 + LEN5 + ipos = ipos + LEN3 + LEN4 + LEN5 ! Copy Section 6 - if (len6 .eq. 6 .and. ibmap .ne. 254) then - gribm(lencur + 1:lencur + len6) = cindex(ipos + 1:ipos + len6) - lencur = lencur + len6 + if (LEN6 .eq. 6 .AND. IBMAP .ne. 254) then + GRIBM(lencur + 1:lencur + LEN6) = CINDEX(ipos + 1:ipos + LEN6) + lencur = lencur + LEN6 else - call g2_gbytec(cindex, iskp6, 24*8, INT4_BITS) ! bytes to skip for section 6 - call baread(lugb, iskip + iskp6, 4, lread, ctemp) - call g2_gbytec(ctemp, len6, 0, INT4_BITS) ! length of section 6 - allocate(csec6(len6)) - call baread(lugb, iskip + iskp6, len6, lread, csec6) - gribm(lencur + 1:lencur + len6) = csec6(1:len6) - lencur = lencur + len6 - if (allocated(csec6)) deallocate(csec6) + CALL G2_GBYTEC(CINDEX, ISKP6, 24*8, 4*8) ! BYTES TO SKIP FOR section 6 + CALL BAREAD(LUGB, ISKIP + ISKP6, 4, LREAD, ctemp) + CALL G2_GBYTEC(Ctemp, LEN6, 0, 4*8) ! LENGTH OF SECTION 6 + ALLOCATE(csec6(len6)) + CALL BAREAD(LUGB, ISKIP + ISKP6, LEN6, LREAD, csec6) + GRIBM(lencur + 1:lencur + LEN6) = csec6(1:LEN6) + lencur = lencur + LEN6 + IF (allocated(csec6)) DEALLOCATE(csec6) endif ! Copy Section 7 - gribm(lencur + 1:lencur + len7) = csec7(1:len7) - lencur = lencur + len7 + GRIBM(lencur + 1:lencur + LEN7) = csec7(1:LEN7) + lencur = lencur + LEN7 ! Section 8 - gribm(lencur + 1) = '7' - gribm(lencur + 2) = '7' - gribm(lencur + 3) = '7' - gribm(lencur + 4) = '7' + GRIBM(lencur + 1) = '7' + GRIBM(lencur + 2) = '7' + GRIBM(lencur + 3) = '7' + GRIBM(lencur + 4) = '7' ! clean up - if (allocated(csec2)) deallocate(csec2) - if (allocated(csec7)) deallocate(csec7) - else ! do not extract field from message : get entire message - call g2_gbytec(cindex, iskip, INT4_BITS, INT4_BITS) ! bytes to skip in file - call g2_gbytec(cindex, leng, 36*8, INT4_BITS) ! length of grib message - if (.not. associated(gribm)) allocate(gribm(leng)) - call baread(lugb, iskip, leng, lread, gribm) - if (leng .ne. lread ) then - deallocate(gribm) - nullify(gribm) - iret = 97 - return - endif - endif -end subroutine getgb2rp2 + IF (allocated(csec2)) DEALLOCATE(csec2) + IF (allocated(csec7)) deallocate(csec7) + ELSE ! DO NOT extract field from message : Get entire message + CALL G2_GBYTEC(CINDEX, ISKIP, 4*8, 4*8) ! BYTES TO SKIP IN FILE + CALL G2_GBYTEC(CINDEX, LENG, 36*8, 4*8) ! LENGTH OF GRIB MESSAGE + IF (.NOT. ASSOCIATED(GRIBM)) ALLOCATE(GRIBM(LENG)) + CALL BAREAD(LUGB, ISKIP, LENG, LREAD, GRIBM) + IF (LENG .NE. LREAD ) THEN + DEALLOCATE(GRIBM) + NULLIFY(GRIBM) + IRET = 97 + RETURN + ENDIF + ENDIF +END SUBROUTINE GETGB2RP