📄 gribend.f
字号:
subroutine gribend(cgrib,lcgrib,lengrib,ierr)!$$$ SUBPROGRAM DOCUMENTATION BLOCK! . . . .! SUBPROGRAM: gribend ! PRGMMR: Gilbert ORG: W/NP11 DATE: 2000-05-02!! ABSTRACT: This subroutine finalizes a GRIB message after all grids! and fields have been added. It adds the End Section ( "7777" )! to the end of the GRIB message and calculates the length and stores! it in the appropriate place in Section 0.! This routine is used with routines "gribcreate", "addlocal", "addgrid",! and "addfield" to create a complete GRIB2 message. Subroutine! gribcreate must be called first to initialize a new GRIB2 message.!! PROGRAM HISTORY LOG:! 2000-05-02 Gilbert!! USAGE: CALL gribend(cgrib,lcgrib,lengrib,ierr)! INPUT ARGUMENT LIST:! cgrib - Character array to contain the GRIB2 message! lcgrib - Maximum length (bytes) of array cgrib.!! OUTPUT ARGUMENT LIST: ! cgrib - Character array to contain the GRIB2 message! lengrib - Length of the final GRIB2 message in octets (bytes)! ierr - Error return code.! 0 = no error! 1 = GRIB message was not initialized. Need to call! routine gribcreate first.! 2 = GRIB message already complete. ! 3 = Sum of Section byte counts doesn't add to total byte count.! 4 = Previous Section was not 7.!! REMARKS: This routine is intended for use with routines "gribcreate", ! "addlocal", "addgrid", and "addfield" to create a complete ! GRIB2 message.!! ATTRIBUTES:! LANGUAGE: Fortran 90! MACHINE: IBM SP!!$$$ character(len=1),intent(inout) :: cgrib(lcgrib) integer,intent(in) :: lcgrib integer,intent(out) :: lengrib,ierr character(len=4),parameter :: grib='GRIB',c7777='7777' character(len=4):: ctemp integer iofst,ibeg,lencurr,len ierr=0!! Check to see if beginning of GRIB message exists! ctemp=cgrib(1)//cgrib(2)//cgrib(3)//cgrib(4) if ( ctemp.ne.grib ) then print *,'gribend: GRIB not found in given message.' ierr=1 return endif!! Get current length of GRIB message! call gbyte(cgrib,lencurr,96,32)!! Check to see if GRIB message is already complete!! ctemp=cgrib(lencurr-3)//cgrib(lencurr-2)//cgrib(lencurr-1)! & //cgrib(lencurr)! if ( ctemp.eq.c7777 ) then! print *,'gribend: GRIB message already complete.'! ierr=2! return! endif!! Loop through all current sections of the GRIB message to! find the last section number.! len=16 ! Length of Section 0 do ! Get number and length of next section iofst=len*8 call gbyte(cgrib,ilen,iofst,32) iofst=iofst+32 call gbyte(cgrib,isecnum,iofst,8) len=len+ilen ! Exit loop if last section reached if ( len.eq.lencurr ) exit ! If byte count for each section doesn't match current ! total length, then there is a problem. if ( len.gt.lencurr ) then print *,'gribend: Section byte counts don''t add to total.' print *,'gribend: Sum of section byte counts = ',len print *,'gribend: Total byte count in Section 0 = ',lencurr ierr=3 return endif enddo!! Can only add End Section (Section 8) after Section 7.! if ( isecnum.ne.7 ) then print *,'gribend: Section 8 can only be added after Section 7.' print *,'gribend: Section ',isecnum,' was the last found in', & ' given GRIB message.' ierr=4 return endif!! Add Section 8 - End Section! cgrib(lencurr+1:lencurr+4)=c7777!! Update current byte total of message in Section 0! lengrib=lencurr+4 call sbyte(cgrib,lengrib,96,32) return end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -