[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [gembud] dcmetr: NAVCANADA LWIS Station data does not decode



Stephen,

Attatched is the modified mtgrpt.f routine. I tested and it does handle
the LWIS.
I haven't yet run on the realtime server to see if anything else has
side effects.

Steve


On Thu, 2007-10-18 at 10:13 -0400, Stephen Sinnis wrote:
> I am using GEMPAK5.10.3 on Linux FC5.
> 
> My users identified that "SA" message observation data from Limited
> Weather Information Service (LWIS), which are available on the NOAAPort
> are not available in NWX.
> 
> If I change the "LWIS" to "METAR" in the bulletin and re-inject to the
> LDM/decoder combination, then it works fine.
> 
> I looked at the dcmetr code and could not see where the issue was.
> 
> Example NOAAPort LWIS:
> 
> ^C^A^M^M
> 921 ^M^M
> SACN62 CWAO 181300^M^M
> LWIS CYDL 181300Z AUTO 06002KT M02/M04 A2938=^M^M
> LWIS CYDQ 181300Z AUTO 00000KT 00/M03 A2962=^M^M
> LWIS CYER 181300Z AUTO 14004KT 05/ A2981=^M^M
> LWIS CYLH 181300Z AUTO 09004KT 05/05 A2976=^M^M
> CZMD NIL=^M^M
> LWIS CZSJ 181300Z AUTO 09004KT 06/06 A2968=^M^M
> ^M^M
> ^M^M
> 
> Has anyone seen a similar problem?
> 
> Stephen Sinnis
> Pelmorex Media Inc
> T. 905.829.1159 x1379
> F. 905.829.5800 
> _______________________________________________
> gembud mailing list
> address@hidden
> For list information or to unsubscribe,  visit: 
> http://www.unidata.ucar.edu/mailing_lists/ 
-- 
Steve Chiswell <address@hidden>
Unidata
        SUBROUTINE MT_GRPT  ( bultin, lenb, bultyp, ibpnt,
     +                        rpttyp, report, lenr, corflg, iret )
C************************************************************************
C* MT_GRPT                                                              *
C*                                                                      *
C* This subroutine gets the next report from a METAR/SPECI bulletin.    *
C* Reports must begin with a four-character station id, and should end  *
C* with '='.  Reports are checked to see if they conform to the         *
C* SAO format.  The report type is saved to common.                     *
C*                                                                      *
C* MT_GRPT  ( BULTIN, LENB, BULTYP, IBPNT, RPTTYP, REPORT, LENR,        *
C*            CORFLG, IRET )                                            *
C*                                                                      *
C* Input parameters:                                                    *
C*      BULTIN          CHAR*           Bulletin                        *
C*      LENB            INTEGER         Bulletin length                 *
C*      BULTYP          CHAR*           Type of bulletin                *
C*                                                                      *
C* Input and output parameters:                                         *
C*      IBPNT           INTEGER         Pointer in bulletin             *
C*                                                                      *
C* Output parameters:                                                   *
C*      RIVALS(IRTHRP)  REAL            Report type flag                *
C*      RPTTYP          CHAR*           Type of report                  *
C*      REPORT          CHAR*           Report                          *
C*      LENR            INTEGER         Length of report                *
C*      CORFLG          LOGICAL         Correction flag                 *
C*      IRET            INTEGER         Return code                     *
C*                                        0 = normal return             *
C*                                       -1 = no station id found       *
C*                                       -2 = no more reports           *
C*                                       -3 = NIL report                *
C**                                                                     *
C* Log:                                                                 *
C* D. Kidwell/NCEP      10/95                                           *
C* D. Kidwell/NCEP      12/95   Check for id at start of US reports     *
C* D. Kidwell/NCEP       3/96   Simplified station id search            *
C* D. Kidwell/NCEP       8/96   Removed references to TESTM, TESTS      *
C* K. Tyle/GSC          11/96   Check for SAO's                         *
C* K. Tyle/GSC           1/97   Reorganize header and comments          *
C* K. Tyle/GSC           3/97   Check length of station id; increase    *
C*                              dimension of stid to 8                  *
C* K. Tyle/GSC           4/97   Check for NIL reports and reports that  *
C*                              begin with WMO bulletin ID              *
C* D. Kidwell/NCEP       6/97   Removed call to ST_LSTR for stid; added *
C*                              explicit character length specification *
C* D. Kidwell/NCEP       6/97   Cleaned up code                         *
C* D. Kidwell/NCEP       4/98   New interface; removed iasos flag       *
C* D. Kidwell/NCEP       9/05   CSC to add corflg                       *
C* S. Chiswell/Unidata  10/07   Added LWIS check                        *
C************************************************************************
        INCLUDE         'mtcmn.cmn'
C*
        CHARACTER*(*)   bultin, report, bultyp, rpttyp
        LOGICAL         corflg
C*
        LOGICAL         found, saoflg, wmo
        CHARACTER       type*8, satype*3, stid*8
C-----------------------------------------------------------------------
        iret   = 0 
        lenr   = 0
        saoflg = .false.
        wmo    = .true.
        corflg = .false.
C
C*      Check for end of bulletin.
C
        IF ( ibpnt + 7 .ge. lenb ) THEN
            report = ' '
            iret   = -2
            RETURN
        END IF
C
C*      Get report type.
C
        rpttyp = ' '
        ibeg   = ibpnt
        type   = bultin ( ibeg:ibeg + 7 )
        indxmt = INDEX ( type, 'METAR' )
        indxsp = INDEX ( type, 'SPECI' )
        indxlw = INDEX ( type, 'LWIS' )
C
C*      Check for SAO format--found in pos. 5-6 in Canadian
C*      and 6-7 in Alaskan rpts.
C
        satype = bultin ( ibeg + 4: ibeg + 6 )
        indxsa = INDEX ( satype, 'SA' )
        indxap = INDEX ( satype, 'SP' )
        IF ( ( indxmt .ne. 0 ) .or.
     +       ( indxlw .ne. 0 ) ) THEN
            rpttyp = 'MT'
          ELSE IF ( indxsp .ne. 0 ) THEN
            rpttyp = 'SP'
          ELSE IF ( indxsa .ne. 0 ) THEN
            rpttyp = 'SA'
            saoflg = .true.
          ELSE IF ( indxap .ne. 0 ) THEN
            rpttyp = 'SX'
            saoflg = .true.
        END IF
C
        IF ( rpttyp .eq. ' ' ) THEN
            rpttyp = bultyp
            IF ( bultyp .eq. ' ' ) rpttyp = 'MT'
          ELSE IF ( indxap .eq. 0 .and. indxsa .eq. 0 ) THEN
            IF ( indxlw .eq. 0 ) THEN
              indx = MAX ( indxmt, indxsp )
              ibeg = ibeg + indx + 5
            ELSE
              indx = indxlw
              ibeg = ibeg + indx + 4
            END IF
        END IF
C
C*      Find the next station id.
C
        DO WHILE ( wmo )
            IF ( rpttyp .ne. ' ' ) THEN
C
C*              Check length of station id.
C
                iblk = INDEX ( bultin ( ibeg:ibeg+8 ), ' ' )
                IF ( iblk .eq. 0 ) THEN 
                    stid = ' '
                  ELSE
                    stid = bultin ( ibeg:ibeg + iblk - 1 )
                END IF
                iens = ibeg + iblk
                lens = iblk - 1
                IF ( lens .eq. 4 ) THEN 
                    found = .true.
                    wmo   = .false.
                  ELSE IF ( lens .eq. 3 .and. saoflg ) THEN 
C
C*                  Canadian SAO report.
C
                    found = .true.
                    wmo   = .false.
                  ELSE 
                    found = .false.
C
C*                  Check if report is mistakenly started with the WMO
C*                  bulletin ID, or for COR preceding the station id.
C
                    IF ( lens .gt. 0 ) THEN
                        IF ( stid .eq. wmohdr ( :lens ) ) THEN
                            ibeg = ibeg + lens + 1
                          ELSE IF ( stid .eq. 'COR' ) THEN
C
C*                          COR precedes the station id (WMO 11/05).
C
                            corflg = .true.                         
                            ibeg   = ibeg + lens + 1
                          ELSE
                            wmo  = .false.
                        END IF
                      ELSE IF ( lens .eq. 0 ) THEN
C
C*                      Leading character is a blank, so keep looking.
C
                        ibeg = ibeg + 1
                      ELSE
                        wmo  = .false.
                    END IF
                END IF 
              ELSE
                found = .false.
                wmo   = .false.
            END IF
        END DO
C
C*      Look for '=' as report terminator.
C
        IF ( ibeg .gt. lenb ) THEN
            iret = -2
            RETURN
          ELSE
            iend1 = INDEX ( bultin ( ibeg:lenb ), '=' )
            IF ( iend1 .ne. 0 ) THEN
                iend = iend1 + ibeg - 2
              ELSE
                iend = lenb
            END IF
        END IF
C
C*      Reset pointer in bulletin.
C
        ibpnt  = iend + 3
C
C*      Construct report and pointers.
C
        IF ( ibeg .gt. iend ) THEN 
            iend = ibpnt
            IF ( ibeg .gt. ibpnt ) THEN
                iret = -2
                RETURN
            END IF
        END IF
        report = bultin ( ibeg : iend )
        CALL ST_LSTR ( report ( :iend - ibeg + 1 ), lenr, ier )
C
C*      Don't decode a report containing "NIL" after station ID.
C
        lenmin = MIN ( lenb, iens + 10 )
        inil   = INDEX ( bultin ( iens:lenmin ), 'NIL' )
        IF ( inil .ne. 0 ) THEN
            iret = -3
            CALL DC_WLOG ( 4, 'DCMETR', 6, report(:lenr), ier)
            RETURN
        END IF
C
C*      Was a station id found?
C
        IF ( .not. found ) THEN
C
C*          No station id found where expected.
C
            iret = -1
          ELSE
C
C*          Have a four character alpha string - assume station id.  
C*          Initialize common variables to missing.
C
            CALL MT_INIT ( mret )
C
C*          Store report type.
C
            IF ( rpttyp .eq. 'MT' ) THEN
                rivals ( irthrp ) = 0.
              ELSE IF ( rpttyp .eq. 'SP' ) THEN
                rivals ( irthrp ) = 1.
            END IF
        END IF
C*
        RETURN
        END