SUBROUTINE CG_GTVS ( string, len, iret ) C************************************************************************ C* CG_GTVS * C* * C* This subroutine decodes the visibility data in one report. * C* CHECK TO SEE IF VIS IS REPORTED IN SM OR NM BEFORE SAVING!!! * C* * C* CG_GTVS ( STRING, LEN, IRET ) * C* * C* Input parameters: * C* STRING CHAR* string containing visibility * C* data * C* LEN INTEGER length of string * C* * C* Output parameters passed via common: * C* RIVALS(IRVSBY) REAL visibility in statute mi. * C* * C* Output parameters: * C* IRET INTEGER Return code * C* 0 = Normal Return * C** * C* Log: * C* C. Caruso Magee/NCEP 4/00 Original Author * C* J. Ator/NCEP 8/01 CG_BKGP -> UT_BKGP * C************************************************************************ INCLUDE 'GEMPRM.PRM' INCLUDE 'cgcmn.cmn' character*(*) string character*8 newfield integer len integer iret logical foundvis iret = 0 CALL UT_BKGP ( string(1:len), iret ) i = 1 foundvis = .false. DO WHILE ((.not. foundvis) .and. (i .le. nflds )) IF ( itypsf(i) .eq. NMR ) THEN foundvis = .true. ivisst = i ELSEIF ( itypsf(i) .eq. NALNMR ) THEN IF ( fields(i) .eq. '.' ) THEN foundvis = .true. ivisst = i ELSE i = i + 1 END IF ELSE i = i + 1 END IF END DO IF ( foundvis ) THEN nfldsleft = nflds - ivisst IF ( itypsf(ivisst) .eq. NMR ) THEN IF ( nfldsleft .eq. 0 ) THEN c c If nfldsleft is 0, number is last field in wxvs string. c CALL ST_INTG ( fields(ivisst)(1:lensf(ivisst)), inum, jret ) IF ( jret .ne. 0 ) RETURN rivals(irvsby) = float(inum) ELSEIF ( nfldsleft .eq. 1 ) THEN c c If nfldsleft is 1, number is next to last field in wxvs string. c IF ( itypsf(ivisst+1) .eq. ALPHA .and. * index(fields(ivisst+1),'YD') .ne. 0 ) THEN c c visibility is in yards. convert to sm (1760 yds = 1 sm). c CALL ST_INTG ( fields(ivisst)(1:lensf(ivisst)), * inum, jret ) IF ( jret .ne. 0 ) RETURN rivals(irvsby) = float(inum)/1760. ELSE c c field which follows is not YD or YDS so just save number into c visibility. c CALL ST_INTG ( fields(ivisst)(1:lensf(ivisst)), * inum, jret ) IF ( jret .ne. 0 ) RETURN rivals(irvsby) = float(inum) END IF ELSE c c more than one field left. check to see if next field is c '.' or '/'. c IF ( itypsf(ivisst+1) .eq. NALNMR ) THEN IF ( fields(ivisst+1) .eq. '.' ) THEN c c next field is a '.'. check to see if followed by number. c IF ( itypsf(ivisst+2) .eq. NMR ) THEN newfield = fields(ivisst)(1:lensf(ivisst))// * fields(ivisst+1)(1:lensf(ivisst+1))// * fields(ivisst+2)(1:lensf(ivisst+2)) CALL ST_CRNM ( newfield, realnum, kret ) IF ( kret .eq. 0 ) rivals(irvsby) = realnum END IF ELSEIF ( fields(ivisst+1) .eq. '/' ) THEN c c next field is a '/'. check to see if followed by number. c IF ( itypsf(ivisst+2) .eq. NMR ) THEN CALL ST_INTG ( fields(ivisst)(1:lensf(ivisst)), * inumer, jret ) IF ( jret .ne. 0 ) RETURN CALL ST_INTG ( fields(ivisst+2)(1:lensf(ivisst+2)), * idenom, jret ) IF ( jret .ne. 0 ) RETURN rivals(irvsby) = float(inumer)/float(idenom) END IF ELSE c c next field is non-alphanum and not part of vis so just c save number into vis c CALL ST_INTG ( fields(ivisst)(1:lensf(ivisst)), * inum, jret ) IF ( jret .ne. 0 ) RETURN rivals(irvsby) = float(inum) END IF ELSE c c next field is a character. c IF ( index(fields(ivisst+1),'YD') .ne. 0 ) THEN c c visibility is in yards. convert to sm (1760 yds = 1 sm). c CALL ST_INTG ( fields(ivisst)(1:lensf(ivisst)), * inum, jret ) IF ( jret .ne. 0 ) RETURN rivals(irvsby) = float(inum)/1760. ELSE CALL ST_INTG ( fields(ivisst)(1:lensf(ivisst)), * inum, jret ) IF ( jret .ne. 0 ) RETURN rivals(irvsby) = float(inum) END IF END IF END IF ELSEIF ( itypsf(ivisst) .eq. NALNMR ) THEN c c Start of vis field is a '.'. Check the next field. c If '.' is last field in wxvs string, return. c IF ( nfldsleft .eq. 0 ) THEN RETURN ELSEIF ( nfldsleft .ge. 1 ) THEN c c If nfldsleft is 1 or more, check to see if next field is number. c If so, cat the number to the decimal and convert to a real. c IF ( itypsf(ivisst+1) .eq. NMR ) THEN newfield = fields(ivisst)(1:lensf(ivisst))// * fields(ivisst+1)(1:lensf(ivisst+1)) CALL ST_CRNM ( newfield, realnum, jret ) IF ( jret .ne. 0 ) RETURN rivals(irvsby) = realnum END IF END IF END IF ELSE WRITE ( UNIT = logmsg, FMT = '( A )' ) * ' No valid visibility string found.' CALL DC_WLOG ( 2, 'CG', 1, logmsg, ierwlg ) END IF RETURN END