SUBROUTINE  LS_PREC( lsfrpt, iparam, ipt, iret )
C************************************************************************
C* LS_PREC                                                              *
C*                                                                      *
C* This subroutine decodes the 6RRRt, 7RRRR, or 2RRRR precipitation     *
C* group.  In the 6RRRt group, RRR and t are WMO code table values which*
C* are converted to the appropriate quantities.  In the 7-group, RRRR is*
C* the precipitation amount in tenths of a millimeter. In the 2-group   *
C* from the 555 section, RRRR is the precipitation amount in hundredths *
C* of an inch.  A trace value is stored as -0.1                         *
C*                                                                      *
C* LS_PREC  ( LSFRPT, IPARAM, IPT, IRET )                               *
C*                                                                      *
C* Input parameters:                                                    *
C*      LSFRPT         	CHAR*           Report array                    *
C*      IPARAM         	INTEGER         Flag value                      *
C*                                        0 = no 2 and 7 group to decode*
C*                                        1 = decode 7 group            *
C*                                        2 = decode 2 group            *
C*      IPREC          	INTEGER         Indicator for inclusion or      *
C*                                      omission of precip data         *
C*      IHOUR          	INTEGER         GMT hour of observation         *
C*					                                *
C*					                                *
C* Input and Output parameters:                                         *
C*	IPT		INTEGER		On input, points to first 'R' in*
C*					6RRRt or 7RRRR group; on output,*
C*					points to location of t in 6RRRt*
C*					                                *
C* Output parameters:                                                   *
C*      RIVALS(IRNPCV)  REAL		Number of precipitation values  *
C*      RIVALS(IRPPRD)  REAL            Duration in hours of precip     *
C*                                      period                          *
C*	RIVALS(IRPAMT)  REAL            Precipitation amount in mm      *
C*	IPDPRC          INTEGER         Precip period for precip amount *
C*                                      from India and Sri Lanka        *
C*	IRET           	INTEGER         Return code                     *
C*				   	  0 = normal return 	        *
C*                                        1 = problems                  *
C*                                                                      *
C**								        *
C* Log:							                *
C* R. Hollern/NCEP       4/96                                           *
C* R. Hollern/NCEP      11/96   Added logic to properly decode the      *
C*                              7-group when precip amount is a trace   *
C* R. Hollern/NCEP      11/96   Corrected error that occurred when 0    *
C*                              precip amount in 6-group                *
C* R. Hollern/NCEP       1/97   Added the code to decode city precip    *
C* R. Hollern/NCEP       2/97   Added code to output the precip amount  *
C*                              if duration of the period is missing    *
C* R. Hollern/NCEP       3/97   Fixed problem when Indian report has a  *
C*                              precipitation period of 21 hours        *
C* R. Hollern/NCEP       1/98   Changed interface                       *
C* A. Hardy/GSC          1/98   Reordered calling sequence              *
C* R. Hollern/NCEP       1/00  	Added multi-layer interface set for     *
C*                              precipitation values                    *
C* J. Ator/NCEP		01/02	Change trace value from -1 to -0.1,	*
C*				remove old PXXM interface variables	*
C************************************************************************
	INCLUDE		'GEMPRM.PRM'
        INCLUDE         'lscmn.cmn'
C*
        CHARACTER*(*)  	lsfrpt
C*
        INTEGER   khrs(10)
C*
        CHARACTER   	fld4*4, fld3*3, fld1*1
        CHARACTER       india*2,  srilka*2,  bnglad*2,  sdarb*2
C*
        DATA  india     / 'IN' /
        DATA  srilka    / 'SB' /
        DATA  bnglad    / 'BW' /
        DATA  sdarb     / 'SD' /
        DATA  khrs      / 6,  12,  18,  24,  1,  2,  3,  9, 15,  21 /
C------------------------------------------------------------------------
        iret = 0
C
        IF ( iparam .eq. 1 ) THEN
            IF ( lsfrpt ( ipt:ipt+3 ) .ne. '////' ) THEN
C
C*              Decode the 24-hour precip amount in 7RRRR group.
C
                fld4 = lsfrpt ( ipt:ipt+3 )
                CALL  ST_INTG ( fld4, ival, ier )
                IF ( ier .eq. 0 ) THEN
                    IF ( ival .eq. 9999 ) THEN
                        xpnnm = -0.1
                      ELSE
                        xpnnm = .1 * FLOAT ( ival )
                    END IF
                    jnprcv = jnprcv + 1
                    rivals ( irpprd ( jnprcv ) ) = 24.
                    rivals ( irpamt ( jnprcv ) ) = xpnnm
C
                    IF ( jnprcv .le. MXPCVL ) THEN
                        rivals ( irnpcv ) = FLOAT ( jnprcv )
                    END IF
                END IF 
            END IF
            ipt = ipt + 3
            RETURN
        END IF
C
        IF ( iparam .eq. 2 ) THEN
            IF ( lsfrpt ( ipt:ipt+3 ) .ne. '////' ) THEN
C
C*              Decode the 24-hour city precip amount in 2RRRR group.
C*              The precip amount in this group is .01 inches or more.
C
                fld4 = lsfrpt ( ipt:ipt+3 )
                CALL  ST_INTG( fld4, ival, ier )
                IF ( ier .eq. 0 ) THEN
                    xval = .01 * FLOAT ( ival )
C
C*                  Convert from inches to millimeters.
C
                    rivals ( ircp24 ) = PR_INMM ( xval )
                END IF
            END IF
            ipt = ipt + 3
            RETURN
        END IF
C
C*      Decode the 6RRRt group.
C*      If precipitation indicator flag is set to 4, then no 
C*      precipitation amount is available.
C
        IF ( iprec .eq. 4 ) THEN
            ipt = ipt + 3
            RETURN
        END IF
C
C*      If flag is set to 3, then precip amount is 0, but is omitted.
C
        IF ( iprec .eq. 3 ) THEN
            IF ( MOD ( ihour, 6 ) .eq. 0 ) THEN
                jnprcv = jnprcv + 1
                rivals ( irpprd ( jnprcv ) ) = 6.
                rivals ( irpamt ( jnprcv ) ) = 0.0
              ELSE IF ( MOD (ihour, 3) .eq. 0 ) THEN
                jnprcv = jnprcv + 1
                rivals ( irpprd ( jnprcv ) ) = 3.
                rivals ( irpamt ( jnprcv ) ) = 0.0
            END IF
C
            IF ( jnprcv .le. MXPCVL ) THEN
                rivals ( irnpcv ) = FLOAT ( jnprcv )
            END IF
C
            RETURN
        END IF
C
C*      Check if precip data is missing.
C
        IF ( lsfrpt ( ipt:ipt+2 ) .eq. '///' ) THEN
            ipt = ipt + 3
            RETURN
        END IF
C
C*      Get precipitation amount in mm.
C
        fld3 = lsfrpt ( ipt:ipt+2 )
        CALL  ST_INTG ( fld3, ival, ier )
        IF ( ier .eq. 0 ) THEN
            IF ( ival .ge. 0 .and. ival .lt. 989 ) THEN
                xpnnm = FLOAT ( ival )    
              ELSE IF ( ival .eq. 990 ) THEN
                xpnnm = -0.1
              ELSE IF ( ival .gt. 990 .and. ival .le. 999 ) THEN
                ival = ival - 990
                xpnnm = .1 * FLOAT ( ival )
              ELSE IF ( ival .eq. 989 ) THEN
                xpnnm = 989.
	      ELSE
		xpnnm = RMISSD
            END IF
          ELSE
            ipt = ipt + 3
            RETURN
        END IF
C
C*      Get duration of precipitation period.
C
        ipt = ipt + 3
        fld1 = lsfrpt (ipt:ipt)
C
        IF ( fld1 .eq. '/' ) THEN
            ier = 0
            IF ( iprec .eq. 2 ) THEN
                IF ( kcoun .eq. india .or. kcoun .eq. srilka ) THEN
C
C*                  Hours since 3Z.
C
                    itm = ihour - 3
                    IF ( itm .lt. 1 ) itm = 24 + itm
C
C*                  Precipitation period.
C
                    ipdprc = itm
C
                    DO i = 1,10
                        If ( khrs(i) .eq. itm ) THEN
                            ival = i
                            ier = 0
                        END IF
                    END DO
                  ELSE IF ( kcoun .eq. bnglad ) THEN
                    ival = 7
                END IF
              ELSE IF ( kcoun .eq. sdarb .and. 
     +                ( ihour .eq. 0 .or. ihour .eq. 12 ) ) THEN
                ival = 2
              ELSE 
C
C*              Set duration of the precip period to missing.
C
                ival = 0
            END IF
          ELSE 
            CALL  ST_INTG( fld1, ival, ier )
        END IF
C
        IF ( ier .eq. 0 ) THEN
C
C* 	    See WMO Code table 4019 for ival.
C
            IF ( ival .eq. 1 ) THEN
                jnprcv = jnprcv + 1
                rivals ( irpprd ( jnprcv ) ) = 6.
                rivals ( irpamt ( jnprcv ) ) = xpnnm
              ElSE IF ( ival .eq. 2 ) THEN
                jnprcv = jnprcv + 1
                rivals ( irpprd ( jnprcv ) ) = 12.
                rivals ( irpamt ( jnprcv ) ) = xpnnm
              ElSE IF ( ival .eq. 3 ) THEN
                jnprcv = jnprcv + 1
                rivals ( irpprd ( jnprcv ) ) = 18.
                rivals ( irpamt ( jnprcv ) ) = xpnnm
              ELSE IF ( ival .eq. 4 ) THEN
                jnprcv = jnprcv + 1
                rivals ( irpprd ( jnprcv ) ) = 24.
                rivals ( irpamt ( jnprcv ) ) = xpnnm
              ELSE IF ( ival .eq. 5 ) THEN
                jnprcv = jnprcv + 1
                rivals ( irpprd ( jnprcv ) ) = 1.
                rivals ( irpamt ( jnprcv ) ) = xpnnm
              ELSE IF ( ival .eq. 6 ) THEN
                jnprcv = jnprcv + 1
                rivals ( irpprd ( jnprcv ) ) = 2.
                rivals ( irpamt ( jnprcv ) ) = xpnnm
              ELSE IF ( ival .eq. 7 ) THEN
                jnprcv = jnprcv + 1
                rivals ( irpprd ( jnprcv ) ) = 3.
                rivals ( irpamt ( jnprcv ) ) = xpnnm
              ELSE IF ( ival .eq. 8 ) THEN
                jnprcv = jnprcv + 1
                rivals ( irpprd ( jnprcv ) ) = 9.
                rivals ( irpamt ( jnprcv ) ) = xpnnm
              ELSE IF ( ival .eq. 9 ) THEN
                jnprcv = jnprcv + 1
                rivals ( irpprd ( jnprcv ) ) = 15.
                rivals ( irpamt ( jnprcv ) ) = xpnnm
              ELSE IF ( ival .eq. 0 .or. ival .eq. 10 ) THEN
C
C*              Duration of the precipitation period is missing.
C
                jnprcv = jnprcv + 1
                rivals ( irpamt ( jnprcv ) ) = xpnnm
            END IF
          ELSE
            RETURN
        END IF
C
        IF ( jnprcv .le. MXPCVL ) THEN
            rivals ( irnpcv ) = FLOAT ( jnprcv )
        END IF
C*
        RETURN
        END