SUBROUTINE DB_S4TP ( dburpt, iend, ipt, iptout, iret ) C************************************************************************ C* DB_S4TP * C* * C* This subroutine decodes the drifting buoy section 4 groups YYMMJ * C* GGgg/ 7V(B)V(B)d(B)d(B). These groups give the exact time of the * C* last known postion of the buoy, and at that position, the direction * C* and speed of the buoy. * C* * C* DB_S4TP ( DBURPT, IEND, IPT, IPTOUT, IRET ) * C* * C* Input parameters: * C* DBURPT CHAR* Report array * C* IEND INTEGER end of section 4 * C* * C* Input parameters: * C* IPT INTEGER On input, points to a character* C* in group preceding the group * C* YYMMJ. * C* * C* Output parameters: * C* IPTOUT INTEGER On output, points to first of * C* last two characters decoded. * C* * C* Output parameters passed via common: * C* RIVALS(IRPSYR) REAL Year at last known position * C* of buoy - YYYY * C* RIVALS(IRPSMN) REAL Month at last known position * C* of buoy - MM * C* RIVALS(IRPSDY) REAL Day of month at last known * C* position of buoy - DD * C* RIVALS(IRPSHR) REAL Hour at last known position of * C* buoy - HH * C* RIVALS(IRPSMI) REAL Minute of hour at last known * C* position of buoy - MI * C* RIVALS(IRDBVV) REAL Drift speed of buoy in cm/sec * C* RIVALS(IRDBDD) REAL Drift direction of buoy in tens* C* of degrees * C* * C* Output parameters: * C* IRET INTEGER Return code * C* 0 = Normal return * C* 1 = Problems * C* * C** * C* Log: * C* R. Hollern/NCEP 12/99 * C* C. Caruso Magee/NCEP 03/2000 Fixed docblock comments. * C* C. Caruso Magee/NCEP 07/2001 Add input/output args since s/r no * C* longer assumes group 7 immediate * C* follows GGgg/ group (need to search for* C* it within section 4 now). Still check * C* for group 7 as it will only be present * C* when Q(L) = 1. * C* C. Caruso Magee/NCEP 01/2006 Fix computation of year at last known * C* position of buoy so it won't fail each * C* decade. * C************************************************************************ INCLUDE 'dbcmn.cmn' C* CHARACTER*(*) dburpt C* CHARACTER fld2*2, fld1*1 LOGICAL more INTEGER iydif, iobyr C------------------------------------------------------------------------ iret = 0 more = .TRUE. C ii = ipt + 4 C DO WHILE ( more ) ipt = ipt + 1 IF ( dburpt ( ipt:ipt) .eq. ' ' ) THEN more = .false. ELSE IF ( ipt .ge. ii ) THEN RETURN END IF END DO C ipt = ipt + 1 C* Get day of month of observation. C fld2 = dburpt ( ipt:ipt+1 ) CALL ST_INTG ( fld2, ival, ier ) IF ( ier .eq. 0 ) THEN IF ( ival .gt. 0 .and. ival .lt. 32 ) THEN rivals ( irpsdy ) = FLOAT ( ival ) ELSE iret = 1 RETURN END IF ELSE iret = 1 RETURN END IF C C* Get month of observation. C ipt = ipt + 2 C fld2 = dburpt ( ipt:ipt+1 ) CALL ST_INTG ( fld2, ival, ier ) IF ( ier .eq. 0 ) THEN IF ( ival .ge. 1 .and. ival .le. 12 ) THEN rivals ( irpsmn ) = FLOAT ( ival ) ELSE iret = 1 RETURN END IF ELSE iret = 1 RETURN END IF C C* Get year of observation - (units digit of year only). C ipt = ipt + 2 fld1 = dburpt ( ipt:ipt ) CALL ST_INTG ( fld1, ival, ier ) IF ( ier .eq. 0 ) THEN iobyr = irptdt (1) iydif = ival - MOD ( iobyr, 10 ) IF ( iydif .gt. 1 ) THEN itm = iobyr - 10 + iydif ELSE IF ( iydif .eq. -9 ) THEN itm = iobyr + 10 + iydif ELSE itm = iobyr + iydif END IF rivals ( irpsyr ) = FLOAT ( itm ) ELSE iret = 1 RETURN END IF C C* Get hour of observation. C ipt = ipt + 2 fld2 = dburpt ( ipt:ipt+1 ) CALL ST_INTG ( fld2, ival, ier ) IF ( ier .eq. 0 ) THEN IF ( ival .ge. 0 .and. ival .le. 23 ) THEN rivals ( irpshr ) = FLOAT ( ival ) ELSE iret = 1 RETURN END IF ELSE iret = 1 RETURN END IF C C* Get minutes of hour of observation. C ipt = ipt + 2 fld2 = dburpt ( ipt:ipt+1 ) CALL ST_INTG ( fld2, ival, ier ) IF ( ier .eq. 0 ) THEN IF ( ival .ge. 0 .and. ival .le. 59 ) THEN rivals ( irpsmi ) = FLOAT ( ival ) ELSE iret = 1 RETURN END IF ELSE iret = 1 RETURN END IF C C* Save pointer which points to last char of YYMMJ GGgg/ or last C* char of LoLoLoLoLoLo, so that we can look for groups 3, 4, 5, and C* 6 upon return to calling subroutine. C ipt = ipt + 2 iptout = ipt C C* Get drifting speed, in cm/sec, of buoy. C DO WHILE ( ipt .lt. iend ) ipt = ipt + 1 C IF ( dburpt(ipt:ipt+1) .eq. ' 7' ) THEN ipt = ipt + 2 fld2 = dburpt ( ipt:ipt+1 ) CALL ST_INTG ( fld2, ival, ier ) IF ( ier .eq. 0 ) THEN rivals ( irdbvv ) = FLOAT ( ival ) ELSE iret = 1 RETURN END IF C C* Get drift direction of buoy, in tens of degrees. C ipt = ipt + 2 fld2 = dburpt ( ipt:ipt+1 ) CALL ST_INTG ( fld2, ival, ier ) IF ( ier .eq. 0 ) THEN rivals ( irdbdd ) = 10.0 * FLOAT ( ival ) ELSE iret = 1 RETURN END IF END IF END DO C RETURN END