📄 getlocal.f
字号:
subroutine getlocal(cgrib,lcgrib,localnum,csec2,lcsec2,ierr)!$$$ SUBPROGRAM DOCUMENTATION BLOCK! . . . .! SUBPROGRAM: getlocal ! PRGMMR: Gilbert ORG: W/NP11 DATE: 2000-05-25!! ABSTRACT: This subroutine returns the contents of Section 2 ( Local ! Use Section ) from a GRIB2 message. Since there can be multiple! occurrences of Section 2 within a GRIB message, the calling routine! indicates which occurrence is being requested with the localnum argument.!! PROGRAM HISTORY LOG:! 2000-05-25 Gilbert!! USAGE: CALL getlocal(cgrib,lcgrib,localnum,csec2,lcsec2,ierr)! INPUT ARGUMENT LIST:! cgrib - Character array that contains the GRIB2 message! lcgrib - Length (in bytes) of GRIB message in array cgrib.! localnum - The nth occurrence of Section 2 requested.!! OUTPUT ARGUMENT LIST: ! csec2 - Character array containing information read from ! Section 2.! The dimension of this array can be obtained in advance! from argument maxlocal, which is returned from subroutine ! gb_info.! lcsec2 - Number of bytes of character array csec2 read from! Section 2.! ierr - Error return code.! 0 = no error! 1 = Beginning characters "GRIB" not found.! 2 = GRIB message is not Edition 2.! 3 = The section 2 request number was not positive.! 4 = End string "7777" found, but not where expected.! 5 = End string "7777" not found at end of message.! 6 = GRIB message did not contain the requested number of! Local Use Sections.!! REMARKS: Note that subroutine gb_info can be used to first determine! how many Local Use sections exist in a given GRIB message.!! ATTRIBUTES:! LANGUAGE: Fortran 90! MACHINE: IBM SP!!$$$ character(len=1),intent(in) :: cgrib(lcgrib) integer,intent(in) :: lcgrib,localnum character(len=1),intent(out) :: csec2(*) integer,intent(out) :: lcsec2,ierr character(len=4),parameter :: grib='GRIB',c7777='7777' character(len=4) :: ctemp integer :: listsec0(2) integer iofst,ibeg,istart,numlocal ierr=0 numlocal=0!! Check for valid request number! if (localnum.le.0) then print *,'getlocal: Request for local section must be positive.' ierr=3 return endif!! Check for beginning of GRIB message in the first 100 bytes! istart=0 do j=1,100 ctemp=cgrib(j)//cgrib(j+1)//cgrib(j+2)//cgrib(j+3) if (ctemp.eq.grib ) then istart=j exit endif enddo if (istart.eq.0) then print *,'getlocal: Beginning characters GRIB not found.' ierr=1 return endif!! Unpack Section 0 - Indicator Section ! iofst=8*(istart+5) call gbyte(cgrib,listsec0(1),iofst,8) ! Discipline iofst=iofst+8 call gbyte(cgrib,listsec0(2),iofst,8) ! GRIB edition number iofst=iofst+8 iofst=iofst+32 call gbyte(cgrib,lengrib,iofst,32) ! Length of GRIB message iofst=iofst+32 lensec0=16 ipos=istart+lensec0!! Currently handles only GRIB Edition 2.! if (listsec0(2).ne.2) then print *,'getlocal: can only decode GRIB edition 2.' ierr=2 return endif!! Loop through the remaining sections keeping track of the ! length of each. Also check to see that if the current occurrence! of Section 2 is the same as the one requested.! do ! Check to see if we are at end of GRIB message ctemp=cgrib(ipos)//cgrib(ipos+1)//cgrib(ipos+2)//cgrib(ipos+3) if (ctemp.eq.c7777 ) then ipos=ipos+4 ! If end of GRIB message not where expected, issue error if (ipos.ne.(istart+lengrib)) then print *,'getlocal: "7777" found, but not where expected.' ierr=4 return endif exit endif ! Get length of Section and Section number iofst=(ipos-1)*8 call gbyte(cgrib,lensec,iofst,32) ! Get Length of Section iofst=iofst+32 call gbyte(cgrib,isecnum,iofst,8) ! Get Section number iofst=iofst+8 ! If found the requested occurrence of Section 2, ! return the section contents. if (isecnum.eq.2) then numlocal=numlocal+1 if (numlocal.eq.localnum) then lcsec2=lensec-5 csec2(1:lcsec2)=cgrib(ipos+5:ipos+lensec-1) return endif endif ! Check to see if we read pass the end of the GRIB ! message and missed the terminator string '7777'. ipos=ipos+lensec ! Update beginning of section pointer if (ipos.gt.(istart+lengrib)) then print *,'getlocal: "7777" not found at end of GRIB message.' ierr=5 return endif enddo!! If exited from above loop, the end of the GRIB message was reached! before the requested occurrence of section 2 was found.! print *,'getlocal: GRIB message contained ',numlocal, & ' local sections.' print *,'getlocal: The request was for the ',localnum, & ' occurrence.' ierr=6 return end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -