Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
rolled back some changes
Browse files Browse the repository at this point in the history
edwardhartnett committed Feb 13, 2024
1 parent 834ac80 commit 2da05fe
Showing 1 changed file with 93 additions and 163 deletions.
256 changes: 93 additions & 163 deletions src/getgb2rp.F90
Original file line number Diff line number Diff line change
@@ -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,202 +34,135 @@
!> - 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
character(len = 4) :: ctemp
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

0 comments on commit 2da05fe

Please sign in to comment.