25 subroutine simpack(fld,ndpts,idrstmpl,cpack,lcpack)
29 integer,
intent(in) :: ndpts
30 real,
intent(in) :: fld(ndpts)
31 character(len=1),
intent(out) :: cpack(*)
32 integer,
intent(inout) :: idrstmpl(*)
33 integer,
intent(out) :: lcpack
38 integer :: ifld(ndpts)
39 integer,
parameter :: zero=0
40 integer :: nbittot, nbits, maxnum, maxdif, left
41 integer :: imax, imin, j
42 real :: rmax, rmin, temp, dscale, bscale
44 bscale=2.0**real(-idrstmpl(2))
45 dscale=10.0**real(idrstmpl(3))
46 if (idrstmpl(4).le.0.OR.idrstmpl(4).gt.31)
then
60 if (fld(j).gt.rmax) rmax=fld(j)
61 if (fld(j).lt.rmin) rmin=fld(j)
69 if (rmin.ne.rmax)
then
73 if (nbits.eq.0.AND.idrstmpl(2).eq.0)
then
77 imin=nint(rmin*dscale)
78 imax=nint(rmax*dscale)
85 ifld(j)=nint(fld(j)*dscale)-imin
87 elseif (nbits.ne.0.AND.idrstmpl(2).eq.0)
then
94 temp=
ilog2(nint(real(maxnum)/(rmax-rmin)))
95 idrstmpl(2)=ceiling(-1.0*temp)
96 bscale=2.0**real(-idrstmpl(2))
99 ifld(j)=max(0,nint(((fld(j)*dscale)-rmin)*bscale))
101 elseif (nbits.eq.0.AND.idrstmpl(2).ne.0)
then
107 maxdif=nint((rmax-rmin)*bscale)
112 ifld(j)=max(0,nint(((fld(j)*dscale)-rmin)*bscale))
114 elseif (nbits.ne.0.AND.idrstmpl(2).ne.0)
then
123 ifld(j)=max(0,nint(((fld(j)*dscale)-rmin)*bscale))
131 left=8-mod(nbittot,8)
146 rmin4 = real(rmin, 4)
148 iref=transfer(ref,iref)
subroutine g2_sbytec(out, in, iskip, nbits)
Put arbitrary size values into a packed bit string, taking the low order bits from each value in the ...
subroutine g2_sbytesc(out, in, iskip, nbits, nskip, n)
Put arbitrary size values into a packed bit string, taking the low order bits from each value in the ...
subroutine mkieee(a, rieee, num)
Copy an array of real to an array of 32-bit IEEE floating points.
Define math functions used by compack(), simpack(), and misspack().
subroutine simpack(fld, ndpts, idrstmpl, cpack, lcpack)
Pack up a data field using a simple packing algorithm as defined in the GRIB2 documention.