Professional Documents
Culture Documents
& ipdsnum,ipdstmpl,numcoord,coordlist,
& iret)
C$$$ SUBPROGRAM DOCUMENTATION BLOCK
C . . . .
C SUBPROGRAM: pds2pdtens
C PRGMMR: Gilbert ORG: W/NP11 DATE: 2003-06-12
C
C ABSTRACT: This routine converts a GRIB1 PDS (Section 1) that includes
C NCEP ensemble PDS extensions
C to a GRIB2 PDS (Section 4) info with appropriate Product Definition
C Template.
C
C PROGRAM HISTORY LOG:
C 2003-06-12 Gilbert
C 2007-02-07 Gilbert - fixed end date calculation
C 2007-05-14 Boi Vuong - Added Time Range Indicator 51 (Climatological
C Mean Value)
C
C USAGE: CALL pds2pdtens(kpds,kens,kprob,xprob,kclust,kmember,
C ipdsnum,ipdstmpl,numcoord,coordlist,iret)
C INPUT ARGUMENT LIST:
C kpds() - GRIB1 PDS info as specified in W3FI63.
C kens() - Ensemble identification from PDS octets 41-45
C kprob() - Ensemble probability info from PDS octets 46 & 47
C xprob() - Ensemble probability info from PDS octets 48-55
C kclust() - Ensemble cluster info from PDS octets 61-76
C kmember()- Ensemble membership info from PDS octest 77-86
C
C OUTPUT ARGUMENT LIST:
C ipdsnum - GRIB2 Product Definition Template Number
C ipdstmpl() - GRIB2 Product Definition Template entries for PDT 4.ipdsnum
C numcoord - number of vertical discretisation values ( not implemented )
C coordlist()- vertical discretisation values ( not implemented )
C iret - Error return value:
C 0 = Successful
C 1 = Unrecognized GRIB1 Time Range Indicator for ensembles
C 2 = Unrecognized GRIB1 Ensemble type
C 10 = Unrecognized GRIB1 Time Range Indicator for probabilities
C
C REMARKS: Use routine pds2pdt for non ensemble related PDS.
C
C ATTRIBUTES:
C LANGUAGE: Fortran 90
C MACHINE: IBM SP
C
C$$$
use params
integer,intent(in) :: kpds(*),kens(*),kprob(*),kclust(*)
integer,intent(in) :: kmember(*)
real,intent(in) :: xprob(*)
integer,intent(out) :: ipdstmpl(*)
real,intent(out) :: coordlist(*)
integer,intent(out) :: ipdsnum,numcoord,iret
integer :: idat(8),jdat(8)
real :: rinc(5)
iret=0
numcoord=0
if (kens(2).eq.1.or.kens(2).eq.2.or.kens(2).eq.3) then
! individual ensemble fcst...
if (kpds(16).eq.0.or.kpds(16).eq.1.or.kpds(16).eq.10) then
! At specific point in time...
ipdsnum=1
! get GRIB2 parameter category and number from GRIB1
! parameter number
call param_g1_to_g2(kpds(5),kpds(19),idum,ipdstmpl(1),
& ipdstmpl(2))
ipdstmpl(3)=4
ipdstmpl(4)=0
ipdstmpl(5)=kpds(2)
ipdstmpl(6)=0
ipdstmpl(7)=0
ipdstmpl(8)=kpds(13)
if (kpds(13).eq.254) ipdstmpl(8)=13
!if (kpds(16).eq.10) then
! ipdstmpl(9)=(kpds(14)*256)+kpds(15)
!else
ipdstmpl(9)=kpds(14)
!endif
call cnvlevel(kpds(6),kpds(7),ipdstmpl)
if (kens(2).eq.1) then
! if (kens(3).eq.1) ipdstmpl(16)=0
! if (kens(3).eq.2) ipdstmpl(16)=1
ipdstmpl(16)=kens(3)-1
ipdstmpl(17)=0
elseif (kens(2).eq.2) then
ipdstmpl(16)=2
ipdstmpl(17)=kens(3)
elseif (kens(2).eq.3) then
ipdstmpl(16)=3
ipdstmpl(17)=kens(3)
endif
ipdstmpl(18)=10
elseif (kpds(16).ge.2.AND.kpds(16).le.5) then
! over time range...
ipdsnum=11
! get GRIB2 parameter category and number from GRIB1
! parameter number
call param_g1_to_g2(kpds(5),kpds(19),idum,ipdstmpl(1),
& ipdstmpl(2))
ipdstmpl(3)=4
ipdstmpl(4)=0
ipdstmpl(5)=kpds(2)
ipdstmpl(6)=0
ipdstmpl(7)=0
ipdstmpl(8)=kpds(13)
if (kpds(13).eq.254) ipdstmpl(8)=13
ipdstmpl(9)=kpds(14)
call cnvlevel(kpds(6),kpds(7),ipdstmpl)
!ipdstmpl(9)=kpds(15)
if (kens(2).eq.1) then
! if (kens(3).eq.1) ipdstmpl(16)=0
! if (kens(3).eq.2) ipdstmpl(16)=1
ipdstmpl(16)=kens(3)-1
ipdstmpl(17)=0
elseif (kens(2).eq.2) then
ipdstmpl(16)=2
ipdstmpl(17)=kens(3)
elseif (kens(2).eq.3) then
ipdstmpl(16)=3
ipdstmpl(17)=kens(3)
endif
ipdstmpl(18)=10
! calculate ending time using initial ref-time, idat,
! and increment rinc.
idat=0
idat(1)=((kpds(21)-1)*100)+kpds(8)
idat(2)=kpds(9)
idat(3)=kpds(10)
idat(4)=-500 ! EST
idat(5)=kpds(11)
idat(6)=kpds(12)
rinc=0
if ( ipdstmpl(8).eq.0 ) then
rinc(3)=kpds(15)
elseif ( ipdstmpl(8).eq.1 ) then
rinc(2)=kpds(15)
elseif ( ipdstmpl(8).eq.2 ) then
rinc(1)=kpds(15)
elseif ( ipdstmpl(8).eq.10 ) then
rinc(2)=kpds(15) * 3
elseif ( ipdstmpl(8).eq.11 ) then
rinc(2)=kpds(15) * 6
elseif ( ipdstmpl(8).eq.12 ) then
rinc(2)=kpds(15) * 12
elseif ( ipdstmpl(8).eq.13 ) then
rinc(4)=kpds(15)
endif
call w3movdat(rinc,idat,jdat) ! calculate end date/time
ipdstmpl(19)=jdat(1) ! year of end time
ipdstmpl(20)=jdat(2) ! month of end time
ipdstmpl(21)=jdat(3) ! day of end time
ipdstmpl(22)=jdat(5) ! hour of end time
ipdstmpl(23)=jdat(6) ! minute of end time
ipdstmpl(24)=jdat(7) ! second of end time
ipdstmpl(25)=1
ipdstmpl(26)=0
if (kpds(16).eq.2) then
ipdstmpl(27)=255
if (kpds(5).eq.15) ipdstmpl(27)=2
if (kpds(5).eq.16) ipdstmpl(27)=3
elseif (kpds(16).eq.3) then
ipdstmpl(27)=0
elseif (kpds(16).eq.4) then
ipdstmpl(27)=1
elseif (kpds(16).eq.5) then
ipdstmpl(27)=4
endif
ipdstmpl(28)=2
ipdstmpl(29)=kpds(13)
if (kpds(13).eq.254) ipdstmpl(29)=13
ipdstmpl(30)=kpds(15)-kpds(14)
ipdstmpl(31)=255
ipdstmpl(32)=0
elseif (kpds(16).eq.51) then
! over time range...
ipdsnum=11
! get GRIB2 parameter category and number from GRIB1
! parameter number
call param_g1_to_g2(kpds(5),kpds(19),idum,ipdstmpl(1),
& ipdstmpl(2))
ipdstmpl(3)=4
ipdstmpl(4)=0
ipdstmpl(5)=kpds(2)
ipdstmpl(6)=0
ipdstmpl(7)=0
ipdstmpl(8)=kpds(13)
if (kpds(13).eq.254) ipdstmpl(8)=13
ipdstmpl(9)=kpds(14)
call cnvlevel(kpds(6),kpds(7),ipdstmpl)
!ipdstmpl(9)=kpds(15)
if (kens(2).eq.1) then
! if (kens(3).eq.1) ipdstmpl(16)=0
! if (kens(3).eq.2) ipdstmpl(16)=1
ipdstmpl(16)=kens(3)-1
ipdstmpl(17)=0
elseif (kens(2).eq.2) then
ipdstmpl(16)=2
ipdstmpl(17)=kens(3)
elseif (kens(2).eq.3) then
ipdstmpl(16)=3
ipdstmpl(17)=kens(3)
endif
ipdstmpl(18)=10
! calculate ending time using initial ref-time, idat,
! and increment rinc.
idat=0
idat(1)=((kpds(21)-1)*100)+kpds(8)
idat(2)=kpds(9)
idat(3)=kpds(10)
idat(4)=-500 ! EST
idat(5)=kpds(11)
idat(6)=kpds(12)
rinc=0
if ( ipdstmpl(8).eq.0 ) then
rinc(3)=kpds(15)
elseif ( ipdstmpl(8).eq.1 ) then
rinc(2)=kpds(15)
elseif ( ipdstmpl(8).eq.2 ) then
rinc(1)=kpds(15)
elseif ( ipdstmpl(8).eq.10 ) then
rinc(2)=kpds(15) * 3
elseif ( ipdstmpl(8).eq.11 ) then
rinc(2)=kpds(15) * 6
elseif ( ipdstmpl(8).eq.12 ) then
rinc(2)=kpds(15) * 12
elseif ( ipdstmpl(8).eq.13 ) then
rinc(4)=kpds(15)
endif
call w3movdat(rinc,idat,jdat) ! calculate end date/time
ipdstmpl(19)=jdat(1) ! year of end time
ipdstmpl(20)=jdat(2) ! month of end time
ipdstmpl(21)=jdat(3) ! day of end time
ipdstmpl(22)=jdat(5) ! hour of end time
ipdstmpl(23)=jdat(6) ! minute of end time
ipdstmpl(24)=jdat(7) ! second of end time
ipdstmpl(25)=1
ipdstmpl(26)=0
ipdstmpl(27)=51
ipdstmpl(28)=2
ipdstmpl(29)=kpds(13)
if (kpds(13).eq.254) ipdstmpl(29)=13
ipdstmpl(30)=kpds(15)-kpds(14)
ipdstmpl(31)=255
ipdstmpl(32)=0
else
Print *,' Unrecognized Time Range Ind for ensembles = ',
& kpds(16),kens(2)
Print *,'pds2pdtens: Couldn:t construct PDS Template '
iret=1
endif
return
end