updated top-level README and version_decl for V4.4.2 (#1795)
[WRF.git] / external / io_grib2 / g2lib / pngunpack.F
blob08413bc3ec308fa5a30fd5a09b0911428bc330af
1       subroutine pngunpack(cpack,len,idrstmpl,ndpts,fld)
2 !$$$  SUBPROGRAM DOCUMENTATION BLOCK
3 !                .      .    .                                       .
4 ! SUBPROGRAM:    pngunpack
5 !   PRGMMR: Gilbert          ORG: W/NP11    DATE: 2000-06-21
7 ! ABSTRACT: This subroutine unpacks a data field that was packed into a
8 !   PNG image format 
9 !   using info from the GRIB2 Data Representation Template 5.41 or 5.40010.
11 ! PROGRAM HISTORY LOG:
12 ! 2000-06-21  Gilbert
14 ! USAGE:    CALL pngunpack(cpack,len,idrstmpl,ndpts,fld)
15 !   INPUT ARGUMENT LIST:
16 !     cpack    - The packed data field (character*1 array)
17 !     len      - length of packed field cpack().
18 !     idrstmpl - Contains the array of values for Data Representation
19 !                Template 5.41 or 5.40010
20 !     ndpts    - The number of data values to unpack
22 !   OUTPUT ARGUMENT LIST:
23 !     fld()    - Contains the unpacked data values
25 ! REMARKS: None
27 ! ATTRIBUTES:
28 !   LANGUAGE: XL Fortran 90
29 !   MACHINE:  IBM SP
31 !$$$
33       character(len=1),intent(in) :: cpack(len)
34       integer,intent(in) :: ndpts,len
35       integer,intent(in) :: idrstmpl(*)
36       real,intent(out) :: fld(ndpts)
38       integer :: ifld(ndpts)
39       character(len=1),allocatable :: ctemp(:)
40       integer(4) :: ieee
41       real :: ref,bscale,dscale
42       integer :: dec_png,width,height
44       ieee = idrstmpl(1)
45       call rdieee(ieee,ref,1)
46       bscale = 2.0**real(idrstmpl(2))
47       dscale = 10.0**real(-idrstmpl(3))
48       nbits = idrstmpl(4)
49       itype = idrstmpl(5)
51 !  if nbits equals 0, we have a constant field where the reference value
52 !  is the data value at each gridpoint
54       if (nbits.ne.0) then
55          allocate(ctemp(ndpts*4))
56          iret=dec_png(cpack,width,height,ctemp)
57          call g2lib_gbytes(ctemp,ifld,0,nbits,0,ndpts)
58          deallocate(ctemp)
59          do j=1,ndpts
60            fld(j)=((real(ifld(j))*bscale)+ref)*dscale
61          enddo
62       else
63          do j=1,ndpts
64            fld(j)=ref
65          enddo
66       endif
69       return
70       end