SUBROUTINE CG_WAVE ( cgrpt, mszrpt, ipt, iret ) C************************************************************************ C* CG_WAVE * C* * C* This subroutine decodes the wave data in one report. * C* * C* CG_WAVE ( CGRPT, MSZRPT, IPT, IRET ) * C* * C* Input parameters: * C* MSZRPT INTEGER Length of report in bytes * C* CGRPT CHAR* Report array * C* * C* Output parameters passed via common: * C* RIVALS(IRWHGT) REAL wave height (feet) * C* RIVALS(IRWPER) REAL wave period (seconds) * C* * C* Input and Output parameters: * C* IPT INTEGER Pointer to start of field. * C* * C* Output parameters: * C* IRET INTEGER Return code * C* 0 = Normal return * C* -1 = No / found in rest of rpt * C* -2 = Invalid field length * C* -3 = Invalid field * C* -4 = Too many fields * C** * C* Log: * C* C. Caruso Magee/NCEP 4/00 Original Author * C* C. Caruso Magee/NCEP 7/00 Added FLAT as optional vers. of CALM. * C* C. Caruso Magee/NCEP 3/01 Remove questions re: parameters and * C* units for wave data. * C* C. Caruso Magee/NCEP 7/01 Fixed typo in check on field length * C* where lensf .gt. 4. (Was length .gt. 4) * C* J. Ator/NCEP 8/01 CG_BKGP -> UT_BKGP * C************************************************************************ INCLUDE 'GEMPRM.PRM' INCLUDE 'cgcmn.cmn' character*(*) cgrpt character*100 stwave logical found integer mszrpt iret = 0 i = ipt found = .false. C C* look for '/' character. stop looping when the '/' we found is C* the field separator. C DO WHILE ( .not. found ) IF ( i .le. mszrpt ) THEN islash = index(cgrpt(i:i),'/') IF ( islash .eq. 0 ) THEN i = i + 1 ELSE iendwv = i - 1 found = .true. END IF ELSE iret = -1 RETURN END IF END DO C C* wave field lies between ipt and iendwv (inclusive). C* compress blanks out of wave field. C stwave = cgrpt(ipt:iendwv) CALL UT_BKGP ( stwave, kret ) IF ( nflds .eq. 0) THEN C C* Wave field is blank (missing) C ipt = iendwv + 2 RETURN ELSEIF ( nflds .eq. 1 ) THEN IF ( itypsf(1) .eq. ALPHA ) THEN C C* Wave field is chars. If CALM or FLAT, set whgt and wper, otherwise C* skip this field (may be missing ('M'), 'CHOP', or invalid chars). C IF ( fields(1) .eq. 'CALM' .or. * fields(1) .eq. 'FLAT' ) THEN rivals(irwhgt) = 0. rivals(irwper) = 0. ipt = iendwv + 2 RETURN ELSEIF ( fields(1) .eq. 'M' .or. * fields(1) .eq. 'CHOP' ) THEN ipt = iendwv + 2 RETURN ELSE logmsg = '(Non-fatal) '//cgrpt(ipt:iendwv) CALL DC_WLOG ( 2, 'CG', -5, logmsg, ierwlg ) ipt = iendwv + 2 RETURN END IF ELSEIF ( itypsf(1) .eq. NMR ) THEN C C* Wave field is numbers. If 0, set whgt and wper. Check length C* if non-zero. If length is 1 or 3, skip this field (invalid C* length). If length is 2 or 4, set whgt if 2, whgt and wper if 4. C* If length is gt 4, set error message and return (invalid field, C* possibly decode error). C IF ( fields(1) .eq. '0' .or. fields(1) .eq. '00' .or. * fields(1) .eq. '000' .or. fields(1) .eq. '0000' ) THEN rivals(irwhgt) = 0. rivals(irwper) = 0. ipt = iendwv + 2 RETURN ELSE IF ( lensf(1) .eq. 1 .or. lensf(1) .eq. 3 ) THEN ipt = iendwv + 2 RETURN ELSEIF ( lensf(1) .eq. 2 ) THEN CALL ST_INTG ( fields(1)(1:2), ist1, ier ) rivals(irwhgt) = FLOAT(ist1) ipt = iendwv + 2 RETURN ELSEIF ( lensf(1) .eq. 4 ) THEN CALL ST_INTG ( fields(1)(1:2), ist1, ier ) CALL ST_INTG ( fields(1)(3:4), ist2, ier ) rivals(irwhgt) = FLOAT(ist1) rivals(irwper) = FLOAT(ist2) ipt = iendwv + 2 RETURN ELSEIF ( lensf(1) .gt. 4) THEN logmsg = cgrpt(ipt:iendwv) CALL DC_WLOG ( 2, 'CG', -5, logmsg, ierwlg ) iret = -2 RETURN END IF END IF ELSE C C* Wave field is neither alpha or numeric. C* Set error message and return (invalid field, C* possibly decode error). C logmsg = cgrpt(ipt:iendwv) CALL DC_WLOG ( 2, 'CG', -5, logmsg, ierwlg ) iret = -3 RETURN END IF ELSEIF ( nflds .eq. 2 ) THEN C C* Two fields, possibly whgt and wper separated by a blank. If C* both fields are numeric and length is less than 3, decode, C* otherwise set error message and return (invalid fields, C* possibly decode error). C IF ( itypsf(1) .eq. NMR .and. itypsf(2) .eq. NMR .and. * lensf(1) .lt. 3 .and. lensf(2) .lt. 3 ) THEN CALL ST_INTG ( fields(1)(1:lensf(1)), ist1, ier ) CALL ST_INTG ( fields(2)(1:lensf(2)), ist2, ier ) rivals(irwhgt) = FLOAT(ist1) rivals(irwper) = FLOAT(ist2) ipt = iendwv + 2 RETURN ELSE logmsg = cgrpt(ipt:iendwv) CALL DC_WLOG ( 2, 'CG', -5, logmsg, ierwlg ) iret = -3 RETURN END IF ELSE C C* Too many fields to be valid wave field. C* Set error message and return (invalid fields, C* possibly decode error). C logmsg = cgrpt(ipt:iendwv) CALL DC_WLOG ( 2, 'CG', -5, logmsg, ierwlg ) iret = -4 RETURN END IF ipt = iendwv + 2 RETURN END