SUBROUTINE HY_DCOD ( cldt, hydrfl, bufrtb, nhours, iret ) C************************************************************************ C* HY_DCOD * C* * C* This routine decodes HYDRO data files from FSL into BUFR format. * C* * C* HY_DCOD ( CLDT, HYDRFL, BUFRTB, NHOURS, IRET ) * C* * C* Input parameters: * C* CLDT CHAR* Date-time from command line * C* HYDRFL CHAR* HYDRO data file from FSL * C* BUFRTB CHAR* BUFR tables file * C* NHOURS INTEGER Max # of hours before run time * C* for creating BUFR output * C* * C* Output parameters: * C* IRET INTEGER Return code: * C* 0 = normal return * C* * C** * C* Log: * C* C. Caruso Magee/NCEP 11/04 Modify for HYDRO data. * C* C. Caruso Magee/NCEP 04/05 Replace SPFH with REHU. * C************************************************************************ INCLUDE 'GEMPRM.PRM' INCLUDE 'BRIDGE.PRM' INCLUDE 'hycmn.cmn' C* CHARACTER*(*) cldt, hydrfl, bufrtb C* CHARACTER rundt*12, sysdt*12, + hydrdn*(DCMXLN), hydrbn*(DCMXLN), + stnm(MXSTNS)*10, acid(MXSTNS)*8, + crpttm(MXSTNS)*9, cstrtm*9, + qcd(MXSTNS,NVAR)*1, + vcname(NVAR)*7, + rimnem(NRIMN)*8, cimnem(NCIMN)*8, + cmsobn*18, cprovdr(MXSTNS)*20 C* REAL slat ( MXSTNS ), slon ( MXSTNS ), selv (MXSTNS), + obs ( MXSTNS, NVAR ) C* INTEGER irundt (5), irptdt (5), wmoid (MXSTNS), + iqca ( MXSTNS, NVAR ), iqcr ( MXSTNS, NVAR ) C* INCLUDE 'ERMISS.FNC' C* C* C* The following variable code names define, in accordance C* with the MADIS table files "static/hydrotbl.txt" and C* "static/hydrovcn.txt", the variables that will be read C* from the HYDRO data file. C* DATA vcname + / 'PCP5M ', 'PCP1H ', 'PCP3H ', 'PCP6H ', + 'PCP12H ', 'PCP24H ', + 'RIVFLO ', 'RIVSTG '/ C*----------------------------------------------------------------------- iret = 0 C C* Extract the basename from the HYDRO data file and write it to C* the decoder log. C CALL FL_PATH ( hydrfl, hydrdn, hydrbn, ierpth ) logmsg = 'HYDRO filename: ' // hydrbn CALL DC_WLOG ( 0, 'DC', 2, logmsg, ierwlg ) C C* Save the HYDRO data file basename in a separate variable C* for later use. C cmsobn = hydrbn(1:18) C C* The MADIS (Meteorological Assimilation Data Ingest System) C* software from FSL will be used to read the HYDRO data file. C* Initialize this software. C CALL MINIT ( 'HYDRO', 'FSL', .false., ierfin ) IF ( ierfin .ne. 0 ) THEN CALL UT_EMSG ( 0, 'MINIT', ierfin ) RETURN END IF C C* Using the HYDRO data file basename, C* compute the MADIS date-time. C READ ( UNIT = hydrbn, FMT = '( I4.4, 2I2.2, 1X, 2I2.2 )', + IOSTAT = ier ) + ifyear, ifmnth, ifdays, ifhour, ifminu IF ( ier .ne. 0 ) THEN CALL UT_EMSG ( 0, 'READ', ier ) RETURN END IF CALL MCHRTIM ( ifyear, ifmnth, ifdays, ifhour, ifminu, + cstrtm, ierfct ) IF ( ierfct .ne. 0 ) THEN CALL UT_EMSG ( 0, 'MCHRTIM', ierfct ) RETURN END IF C C* Retrieve all of the stations for which there is data in the C* HYDRO data file. C CALL MHYDROSTA ( cstrtm, nstns, stnm, wmoid, slat, slon, selv, + crpttm, cprovdr, ierfst ) IF ( ierfst .ne. 0 ) THEN IF ( ierfst .eq. 1006 ) THEN logmsg = 'contained no reports' CALL DC_WLOG ( 0, 'DC', 2, logmsg, ierwlg ) ELSE CALL UT_EMSG ( 0, 'MHYDROSTA', ierfst ) END IF RETURN END IF C C* Now, retrieve the data for these stations. C DO ii = 1, NVAR CALL MGETHYDRO ( cstrtm, vcname ( ii ), itmp, nnmsg, + obs ( 1, ii ), qcd ( 1, ii ), + iqca ( 1, ii ), iqcr ( 1, ii ), ierfgs ) IF ( ( ierfgs .ne. 0 ) .and. ( ierfgs .ne. 1006 ) ) THEN CALL UT_EMSG ( 0, 'MGETACARS', ierfgs ) RETURN END IF END DO C C* Set the pointers for the interface arrays. C CALL HY_IFSP ( rimnem, cimnem, ierfsp ) IF ( ierfsp .ne. 0 ) THEN RETURN ENDIF C C* Open the BUFR tables file. C CALL FL_SOPN ( bufrtb, iunbft, ierspn ) IF ( ierspn .ne. 0 ) THEN CALL DC_WLOG ( 0, 'FL', ierspn, bufrtb, ierwlg ) RETURN END IF C C* Open the BUFR output file. C CALL FL_GLUN ( iunbfo, iergln ) IF ( iergln .ne. 0 ) THEN CALL DC_WLOG ( 0, 'FL', iergln, ' ', ierwlg ) RETURN END IF C C* Connect the BUFR tables and output files to the BUFR interface. C CALL OPENBF ( iunbfo, 'NUL', iunbft ) C C* Close the BUFR tables file. C CALL FL_CLOS ( iunbft, iercls ) IF ( iercls .ne. 0 ) THEN CALL DC_WLOG ( 0, 'FL', iercls, ' ', ierwlg ) END IF C C* Get the system time. C itype = 1 CALL CSS_GTIM ( itype, sysdt, iergtm ) IF ( iergtm .ne. 0 ) THEN CALL DC_WLOG ( 2, 'SS', iergtm, ' ', ierwlg ) RETURN END IF C C* If a date-time was entered on the command line, then use it as C* the run date-time. Otherwise, use the system time as the run C* date-time. C IF ( cldt .eq. 'SYSTEM' ) THEN rundt = sysdt ELSE CALL TI_STAN ( cldt, sysdt, rundt, ierstn ) IF ( ierstn .ne. 0 ) THEN CALL DC_WLOG ( 2, 'TI', ierstn, ' ', ierwlg ) RETURN END IF END IF C C* Convert the run date-time to integer. C CALL TI_CTOI ( rundt, irundt, iercto ) IF ( iercto .ne. 0 ) THEN CALL DC_WLOG ( 2, 'TI', iercto, ' ', ierwlg ) RETURN END IF C C* Write the number of reports to the decoder log. C WRITE ( UNIT = logmsg, FMT = '( A, I6, A )' ) + 'contained ', nstns, ' reports' CALL DC_WLOG ( 0, 'DC', 2, logmsg, ierwlg ) C C* Loop on each report. C DO ii = 1, nstns C C* Start an entry for this report in the decoder log. C logmsg = '--------------------' CALL DC_WLOG ( 3, 'DC', 2, logmsg, ierwlg ) C C* Initialize the interface values arrays. C CALL HY_IFIV ( ierfiv ) C C* Compute and store the date-time. C CALL MINTTIM ( crpttm ( ii ), ifyear, ifmnth, ifdays, + ifhour, ifminu, ierftm ) IF ( ierftm .ne. 0 ) THEN CALL UT_EMSG ( 2, 'MINTTIM', ierftm ) ELSE rivals ( iryear ) = FLOAT ( 1900 + ifyear ) rivals ( irmnth ) = FLOAT ( ifmnth ) rivals ( irdays ) = FLOAT ( ifdays ) rivals ( irhour ) = FLOAT ( ifhour ) rivals ( irminu ) = FLOAT ( ifminu ) END IF C C* Station and provider IDs. C civals ( ichyid ) = stnm ( ii )(1:8) civals ( icprvid ) = cprovdr ( ii )(1:10) C C* Latitude, longitude, and elevation. C rivals ( irslat ) = slat ( ii ) rivals ( irslon ) = slon ( ii ) rivals ( irselv ) = selv ( ii ) C C* River flow and river stage. C rivals (irrflo) = UT_MDRI ( obs ( ii, 7 ) ) rivals (irrstg) = UT_MDRI ( obs ( ii, 8 ) ) C C* 5-min precip (and associated QC values). C CALL UT_MDQI ( ii, 1, obs, qcd, iqca, iqcr, MXSTNS, + rivals ( irpcp5m ), civals ( icpcp5qd ), + rivals ( irpcp5qa ), rivals ( irpcp5qr ), ierf ) C C* 1-hr precip (and associated QC values). C CALL UT_MDQI ( ii, 2, obs, qcd, iqca, iqcr, MXSTNS, + rivals ( irpcp1h ), civals ( icpcp1qd ), + rivals ( irpcp1qa ), rivals ( irpcp1qr ), ierf ) C C* 3-hr precip (and associated QC values). C CALL UT_MDQI ( ii, 3, obs, qcd, iqca, iqcr, MXSTNS, + rivals ( irpcp3h ), civals ( icpcp3qd ), + rivals ( irpcp3qa ), rivals ( irpcp3qr ), ierf ) C C* 6-hr precip (and associated QC values). C CALL UT_MDQI ( ii, 4, obs, qcd, iqca, iqcr, MXSTNS, + rivals ( irpcp6h ), civals ( icpcp6qd ), + rivals ( irpcp6qa ), rivals ( irpcp6qr ), ierf ) C C* 12-hr precip (and associated QC values). C CALL UT_MDQI ( ii, 5, obs, qcd, iqca, iqcr, MXSTNS, + rivals ( irpcp12h ), civals ( icpcp12qd ), + rivals ( irpcp12qa ), rivals ( irpcp12qr ), ierf ) C C* 24-hr precip (and associated QC values). C CALL UT_MDQI ( ii, 6, obs, qcd, iqca, iqcr, MXSTNS, + rivals ( irpcp24h ), civals ( icpcp24qd ), + rivals ( irpcp24qa ), rivals ( irpcp24qr ), ierf ) C C* Write the interface output to the decoder log. C CALL HY_IFPT ( 3, rimnem, cimnem, ierfpt ) C C* Do not create BUFR output for reports that are C* more than NHOURS before or more than 3 hours C* after the run time. C IF ( ( ERMISS ( rivals ( iryear ) ) ) .or. + ( ERMISS ( rivals ( irmnth ) ) ) .or. + ( ERMISS ( rivals ( irdays ) ) ) .or. + ( ERMISS ( rivals ( irhour ) ) ) .or. + ( ERMISS ( rivals ( irminu ) ) ) ) THEN iertmk = -1 ELSE irptdt (1) = INT ( rivals ( iryear ) ) irptdt (2) = INT ( rivals ( irmnth ) ) irptdt (3) = INT ( rivals ( irdays ) ) irptdt (4) = INT ( rivals ( irhour ) ) irptdt (5) = INT ( rivals ( irminu ) ) CALL DC_TMCK ( 2, irundt, irptdt, nhours, 180, + iertmk ) END IF IF ( iertmk .eq. 0 ) THEN C C* Convert interface-format data for this report C* into BUFR output and then write the BUFR output C* to the BUFR output stream. C CALL HY_BUFR ( iunbfo, irundt, cmsobn, ierbfr ) END IF C END DO C C* Make sure that all BUFR output has been written before exiting. C CALL UT_WBFR ( iunbfo, 'hydro', 1, ierwbf ) C CALL CLOSBF ( iunbfo ) CALL FL_CLAL ( iercal ) C* RETURN END