Program ISH SUMMARY OF DAY **** **** THIS PROGRAM WILL READ ISH SURFACE DATA (VAR LEN) & **** PRODUCE SUMMARY OF DAY DATA. **** **** AUTHOR: NEAL LOTT **** MIGRATED AND MODIFIED BY: ANNE BARRETT, WAYNE ZHU **** FURTHER MODIFICATIONS: NEAL LOTT, BYRON GLEASON, DAVE WUERTZ **** **** NOTE: 7/98. ABARRETT/MARADA Y2K. THIS PROGRAM WAS MODIFIED TO * READ INPUT FROM DISK FOR MIGRATION FROM UNISYS MAINFRAME TO * IBM UNIX SYSTEM ( TORNADO ) UNDER DIRECTION OF NEAL LOTT/ TOM * WHITEHURST. * PER TOM'S REQUEST THE INCLUDE FILE ( DAT3.COM ) HAS BEEN COPIED * INTO THIS PROGRAM. COMMENTS HAVE BEEN ADDED TO THE FIRST OCCURENCE * ONLY. THE INCLUDE STATEMENTS HAVE BEEN COMMENTED OUT PRIOR TO COPYING * THE INCLUDE FILE. **** **** MODIFICATIONS BY BYRON GLEASON AND DAVE WUERTZ IN OCT 03 TO **** READ ISH INSTEAD OF DATSAV3 FORMATTED INPUT. **** FURTHER MODIFICATIONS BY NEAL LOTT IN MAR 04 TO BETTER HANDLE PRECIP **** DATA FOR STATIONS WHICH OFTEN USE A COMBINATION OF REPORTING -- EG, **** MIX OF 6-HOURLY REPORTS AND 24-HOURLY REPORTS, BUT NOT CONSISTENTLY... **** WHICH DRIVES ME NUTS! **** IMPLICIT INTEGER(A-Z) integer &HR12CK, HRDIF, IDS, IRUSSI, & K, K1, K2, MAX2, & MIN2, MNCHK, MXCHK, P00, & P06, P12, P18, P24, &PCPCHK, PRCP6, SNDP2, STNIND, &TIMIND, TPCNT, AWDCT, GUSTI, &HR06CK, i character *80, cInfile character *80, cOutfile *** *** *** BASIC VARIABLE DEFINITIONS: *** *** 'AVG' IN NAME INDICATES AVERAGE *** 'SUM' IN NAME INDICATES SUMMATION *** 'MAX' IN NAME INDICATES MAXIMUM FOR DAY *** 'CNT' IN NAME INDICATES COUNT FOR THAT VARIABLE *** 'FLG' IN NAME INDICATES FLAG FOR THAT VARIABLE *** 'PRV' IN NAME INDICATES PREVIOUS RECORD *** 'IN' IN NAME INDICATES CONVERTED TO INCHES *** 'F' IN NAME INDICATES CONVERTED TO FAHRENHEIT *** 'MB' IN NAME INDICATES MILLIBARS *** 'K' IN NAME INDICATES KNOTS *** TT = DRY BULB TEMP *** TDD = DEW POINT *** SLP = SEA LEVEL PRESSURE *** STP = STATION PRESSURE *** VIS = VISIBILITY *** SPD = WIND SPEED *** GSTMX2 = WIND GUST FROM ADDITIONAL DATA *** MAXTMP = MAXIMUM TEMP *** MINTMP = MINIMUM TEMP *** THRMAX = MAXIMUM TEMP FROM HOURLY DATA *** THRMIN = MINIMUM TEMP FROM HOURLY DATA *** PCP = PRECIP (6A,6B,6C,6D = 6-HRLYS 12A,12B = 12-HRLYS *** 24 = 24-HRLY TOT = DAILY TOTAL) *** SNDP = SNOW DEPTH *** PREC = PRECIP INCLUDE 'dat3.com' call getarg(1,cInfile) call getarg(2,cOutfile) *** INITIALIZE ALL VARIABLES AS NEEDED *** K1 = 0 K2 = 0 OBCNT = 0 TPCNT = 0 OPCNT = 0 HRPRV = 99 HR24P = 99 HR06P = 99 HR12P = 99 HR24CK = 99 HR06CK = 99 HR12CK = 99 HRDIF = 99 INDA12 = 0 MAXTMP = 9999.9 MINTMP = 9999.9 MAXPRV = 9999.9 MINPRV = 9999.9 THRMAX = -999.9 THRMIN = 9999.9 MAXFLG = ' ' MINFLG = ' ' SNDPIN = 999.9 PCP6A = 99.99 PCP6B = 99.99 PCP6C = 99.99 PCP6D = 99.99 PCP6 = 99.99 PCP12A = 99.99 PCP12B = 99.99 PCP12 = 99.99 PCP24 = 99.99 PCPRAT = 99.99 TTAVG = 9999.9 TDDAVG = 9999.9 SLPAVG = 9999.9 STPAVG = 9999.9 VISAVG = 999.9 SPDAVG = 999.9 PCPTOT = 99.99 GSTALL = 999.9 P00 = 0 P06 = 0 P12 = 0 P18 = 0 P24 = 0 ** C --------- ADD OPEN FILE 21 FOR DISK OUTPUT ------ OPEN (21,FILE=cOutFile,STATUS='REPLACE',ACTION='WRITE') C OPEN (11,FILE=cInfile,STATUS="OLD", - ACCESS="SEQUENTIAL",ACTION="READ",FORM="FORMATTED") C ----- WRITE HEADER RECORD WRITE (21,960) 960 FORMAT ('STN--- WBAN YEARMODA TEMP DEWP ', - ' SLP STP VISIB WDSP ', - 'MXSPD GUST MAX MIN PRCP SNDP FRSHTT') ***************************************************************** * * ----- VARIABLE INITIALIZATION / RECORD * ----- * ----- BEGINNING OF READ LOOP FOR DATSAV FILE * ***************************************************************** 2 TTF = 9999.9 TDDF = 9999.9 SLPIN = 99.99 SLPMB = 9999.9 STPMB = 9999.9 SPEEDK = 999.9 GUSTK = 999.9 GUSTK2 = 999.9 VISBYM = 999.9 MXCHK = 9999 MNCHK = 9999 MAX2 = 9999 MIN2 = 9999 GUSTI = 9999 SNDP2 = 999 STPC = 99999 OBCNT = OBCNT + 1 !AB TEST print*, 'OB# =', obcnt !AB TEST if (obcnt > 4000) go to 99 AWDCT = 0 C INDA12 = 0 C ---------------- READ ISH DATA RECORD READ(11,FMT=799,END=99) C_RECLEN,CONTROL,MANDATORY,(ADDL(K),K=1, - C_RECLEN) 799 FORMAT(I4,A56,A45,10000A) READ (CONTROL,FMT=800)STN,WBAN,YEAR,MO,DA,HR,MN,CDSFLAG,LAT,LON, - TPRPT,STNELV,C_STNID,C_METPOB 800 FORMAT(I6,I5,I4,I2,I2,I2,I2,A1,I6,I7,A5,I5,A5,A4) !datsav3 degree in thousant->datsav2 degree and minute lat=lat/1000*100 + (lat-lat/1000*1000)*60/1000 STNIND = 0 TIMIND = 0 PCPCHK = 0 IRUSSI = 0 TMSHFT = 0 IF (MN .GE. 30) THEN HR = HR + 1 TMSHFT = 1 ELSE END IF *** *** VARIOUS STN INDICATORS ARE SET TO HANDLE CERTAIN COUNTRIES AND WMO *** BLOCKS PROPERLY. *** IF (STN .GE. 690000 .AND. STN .LE. 789999) STNIND = 1 IF (STN .GE. 910000 .AND. STN .LE. 912999) STNIND = 1 IF (STN .GE. 994000 .AND. STN .LE. 994999) STNIND = 1 IF (STN .GE.200000 .AND. STN .LE. 389999) STNIND = 2 IF (STN.GE.960000 .AND.STN.LE.962999.AND.YEAR.GE.1982) STNIND = 3 IF (STN.GE.965000 .AND.STN.LE.979999.AND.YEAR.GE.1982) STNIND = 3 IF (STN.GE.470000 .AND. STN.LE. 479999) STNIND = 4 IF (STN.GE.890000 .AND. STN.LE. 899999) STNIND = 5 IF (HR .NE. 00 .AND. HR .NE. 06 .AND. HR .NE. 12 - .AND. HR .NE.18 .AND. HR .NE. 24) TIMIND = 1 IF (STNIND .EQ. 1 .AND. TIMIND .EQ. 1) PCPCHK = 1 IF (STNIND .EQ. 4 .AND. YEAR .GE. 1973) PCPCHK = 1 IF (HR.EQ.0 .OR. HR.EQ.6 .OR. HR.EQ.12 .OR. HR.EQ.18) TIMIND = 2 C Removed >= 1982 for next 2 lines IF (STNIND.EQ.2.AND.TIMIND.EQ.2.AND.YEAR.LE.1999) IRUSSI = 1 IF (STNIND.EQ.4.AND.TIMIND.EQ.2.AND.YEAR.LE.1999) IRUSSI = 1 IF (STN.GE.010000 .AND. STN.LE.179999 .AND. - HR .EQ. 6) STNIND = 7 IF (STN.GE.010000 .AND. STN.LE.179999 .AND. - HR .EQ. 18) STNIND = 7 IF (STNIND .EQ. 7 .AND. YEAR .LE. 1999) IRUSSI =1 K1 = K1 + 1 K2 = K2 + 1 C ------ SET CONTROL FIELDS ------ C C OMIT ANY ROVING SHIP/DRIFTING BUOY DATA C IF (STN .EQ. 999999.AND.WBAN.EQ.99999) GO TO 99 C------------------------------------------------------------- C THEN, DO SUMMATIONS AND AVERAGES C C CHECK FOR NEW STN, YEAR, MONTH, OR DAY-- C------------------------------------------------------------- IF ((YEAR .EQ. YRPRV .AND. MO .EQ. MOPRV - .AND. DA .EQ. DAPRV .AND. STN .EQ. STNPRV) - .OR. (OBCNT .EQ. 1)) THEN CALL MANSEC CALL ADDSEC CALL SUMS GO TO 2 ELSE CALL DAILY CALL WRITE CALL MANSEC CALL ADDSEC CALL SUMS GO TO 2 END IF 99 CALL DAILY CALL WRITE ! IF (STN .EQ. 999999) GO TO 999 999 OBCNT = OBCNT - 1 c PRINT*,' **** NUMBER OF INPUT OBS = ',OBCNT,' ****' c PRINT*,' **** NUMBER OF OUTPUT RECORDS = ',OPCNT,' ****' c PRINT*,' *** *** **** HAVE A NICE DAY! *** *** ****' STOP END