home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-387-Vol-3of3.iso / h / house_ii.zip / FOR / WETHR.FOR < prev    next >
Text File  |  1992-04-09  |  15KB  |  457 lines

  1.       SUBROUTINE WETHR(IBLOCK,NSEQW)
  2. C
  3. C SEGMENT OF PROGRAM TO READ AND PROCESS WEATHER DATA
  4. C        IBLOCK=1...READ IN SOLAR DATA
  5. C               2...READ IN OTHER DATA
  6. C               3...MEAN DAY/AVERAGES/INTERPOLATE
  7. C               4...START A NEW HOUR
  8. C               5...STEP WITHIN AN HOUR
  9. C
  10. C        NSEQW =0...CARRIER DATA FROM TAPE20
  11. C               1...BCL INITIAL DATA SEQUENTIAL (CITY DATA), TAPE40
  12. C               2...BCL HOUSE WEATHER DATA (MEASURED) TAPE40
  13. C               .LT.0...CARRIER DATA FROM INPUT
  14. C
  15. C         WHEN NSEQW=2, TAPES 41 AND 19 ARE WRITTEN IF THEY DON'T
  16. C         EXIST. THEY CONTAIN
  17. C         TAPE41...SEQUENTIAL WEATHER DATA
  18. C         TAPE19...HOURLY SOLAR DATA 
  19. C         TAPE45...AVERAGED ATTACHED SPACE TEMPERATURE
  20. C
  21. C WEATHER DATA CHANNEL ASSIGNMENTS
  22. C  1)UNUSED           2)TC-REFERENCE         3)WIND SPEED
  23. C  4)WIND DIRECTION   5)UNUSED               6)SOLAR
  24. C  7)                 8)DRY BULB             9)PRESSURE
  25. C 10)GARAGE TEMP     11)-14)UNUSED          15)OUT DOOR WET BULB
  26. C
  27. C =====================================================================
  28. C
  29. CMDK IWETHR
  30. CMDK OWETHR
  31. CMDK SIMA
  32. CMDK TIMEB
  33. CMDK TSTATC
  34.       REAL WTIME(200),WDATA(15),WDOLD(15)
  35.       REAL ODDB(200),ODHUM(200),WIND(200), TGAR(200)
  36.       REAL NDYRT(12)
  37.       INTEGER ITIME(6)
  38.       LOGICAL FIRST45
  39.  
  40. C *** FUNCTION DEFINITIONS
  41. C
  42.       TOD()=FLOAT(ITIME(2))+FLOAT(ITIME(3))/60.+
  43.      +           FLOAT(ITIME(4))/3600.+FLOAT(ITIME(5))/36000.
  44. C
  45.       XINTER(X1,Y1,X2,Y2,X)=   Y1 + (Y2-Y1)/(X2-X1) * (X-X1)
  46. C
  47.       DATA NDYRT/31,59,90,120,151,181,212,243,273,304,334,365/
  48.       DATA FIRST45/.TRUE./
  49.       DATA WDATA,WDOLD/30*0.0/
  50.       DATA I45/0/,TX/0./
  51.       DATA BAD/1.E10/, SMALL/1.E-10/
  52.       DATA INPRT1/0/
  53. C
  54.       IDBG=0
  55.       GO TO (1000,2000,3000,4000,5000)IBLOCK
  56. C
  57. C =====================================================================
  58. C *** BLOCK 1: READ IN SOLAR DATA
  59. C
  60.  1000 CONTINUE
  61. C
  62.       IDAYDB=0
  63.       IF(NSEQW.LT.0) THEN
  64.           KM=-NSEQW
  65. C         INSERT CARRIER READ CARDS CODE
  66.           STOP 'WETHR ERROR -.0'
  67.       ELSE IF(NSEQW.EQ.0) THEN
  68. C        INSTALL CARRIER TAPE DATA CODE  FOR READING TAPE20
  69.          STOP 'WETHR ERROR 1.0'
  70. C
  71.       ELSE IF(NSEQW.EQ.1) THEN
  72. C        INSTALL TAPE40 SEQUENTIAL DATA CODE
  73.          STOP 'WETHR ERROR 1.1'
  74. C
  75.       ELSE IF(NSEQW.EQ.2) THEN
  76. C
  77. C             READ/WRITE INITIAL RECORDS
  78.           REWIND 40
  79.           REWIND 41
  80.  1210     CONTINUE
  81. C
  82. C  TAPE40 WAS WRITTEN BY BATTELLE'S BURR-BROWN DATA LOGGER
  83. C  WTIME(2) -
  84. C  ITIME(1-5) -
  85. C  ICODE - NO. OF WDATA ITEMS TO READ( LESS 1 )
  86. C  ITIME(6) -
  87. C  WDATA(3) - WIND SPEED, MILES/HR
  88. C  WDATA(6) - TOTAL SOLAR RADIATION ON HORIZONTAL SURFACE, BTU/HR-FT2
  89. C  WDATA(8) - OUTDOOR DRY-BULB TEMP, F
  90. C  WDATA(10) - GARAGE AIR TEMP, F
  91. C  WDATA(15) - OUTDOOR SPECIFIC HUMIDITY OUTPUT, WET-BULB TEMP INPUT
  92. C  WDATA(6) -
  93.           READ(40,100,IOSTAT=IEOF40) WTIME(2),(ITIME(I),I=1,5),
  94.      +           ICODE,ITIME(6),(WDATA(I),I=2,ICODE)
  95.           IF(IEOF40.LT.0) THEN
  96.                 WRITE(60,*) 'TIME = ',WTIME(2),' IEOF40 = ',IEOF40
  97.                 STOP 'EOF ON T40 AT 1210'
  98.           ENDIF
  99.           NDYRQ=ITIME(1)
  100.           DO 1211 KQ=1,12
  101.           IF(NDYRQ.LE.NDYRT(KQ))GO TO 1212
  102.  1211     CONTINUE
  103.           STOP 'WETHR:DAY OF YR BAD ON TAPE40'
  104.  1212     IMO=KQ
  105.           DO 1213 I=1,ICODE
  106.           IF(ABS(WDATA(I)).LT.SMALL. OR.
  107.      +       ABS(WDATA(I)).GT.BAD     ) WDATA(I)=SMALL
  108.  1213     CONTINUE
  109.           IF(ISDAY.GT.ITIME(1)) GO TO 1210
  110.           ISDAY=ITIME(1)
  111.           IF(INPRT1.NE.0) WRITE(60,500) WTIME(2),(ITIME(I),I=1,6),
  112.      +        ICODE,(I,I=1,ICODE)
  113.           IDAY41=0
  114.           TIME41=23.9
  115.           WDATA(6)=0.0
  116.           IF(WDATA(15).GT.WDATA(8)) WDATA(15)=WDATA(8)-.1
  117.           IF(ICODE.GE.15) THEN
  118. C                SET SPECIFIC HUMIDITY (USE FUNCS FROM PSY)
  119.             PWSS = FPWS(WDATA(8))
  120.             WSS = FW22(PWSS)
  121.             W = FW35(WDATA(8),WDATA(15),WSS)
  122.           ENDIF
  123.           WDATA(15)=W
  124.           WRITE(41,200) IDAY41,TIME41,(WDATA(I),I=1,ICODE)
  125.           IF(INPRT1.NE.0)WRITE(60,510) IDAY41,TIME41,
  126.      +                         (WDATA(J),J=1,ICODE)
  127.           IDAY41=1
  128. C
  129. C             FILL IN FROM MIDNIGHT TO ITIME(2)
  130.           IF(ITIME(2).NE.0) THEN
  131.                  DO 1220 I=1,ITIME(2)
  132.                     TIME41=FLOAT(I-1)+.00001
  133.                     WRITE(41,200) IDAY41,TIME41,
  134.      +                   (WDATA(J),J=1,ICODE)
  135.                     IF(INPRT1.NE.0)WRITE(60,510) IDAY41,TIME41,
  136.      +                   (WDATA(J),J=1,ICODE)
  137.                     SOLARH(I)=0.0
  138.                     ODDB(I) = WDATA(8)
  139.  1220            CONTINUE
  140.                  ITIM2 = ITIME(2)
  141.                  TIME41=TOD()
  142.                  WRITE(41,200) IDAY41,TIME41,
  143.      +                   (WDATA(J),J=1,ICODE)
  144.           ENDIF
  145. C
  146. C                READ, PROCESS AND WRITE DATA
  147.           LASTDAY=ITIME(1)
  148.           LASTHR=ITIME(2)
  149.           SDB=0.
  150.           SDTDB=0.
  151.           SSF=0.
  152.           SDTSF=0.
  153. C
  154.  1230     CONTINUE
  155.           IF(IEDAY.LT.ITIME(1)) GO TO 1250
  156.           WTIME(1)=WTIME(2)
  157.           DO 1235 I=1,ICODE
  158.            WDOLD(I)=WDATA(I)
  159.  1235     CONTINUE
  160.           READ(40,100,END=1250) WTIME(2),(ITIME(I),I=1,5),
  161.      +        ICODE,ITIME(6),(WDATA(I),I=2,ICODE)
  162. C  FIND MONTH OF YEAR FOR EACH NEW DAY OF YEAR ON WEATHER TAPE
  163.           IF(NDYRQ.NE.ITIME(1))THEN
  164.              NDYRQ=ITIME(1)
  165.              DO 1236 KQ=1,12
  166.              IF(NDYRQ.LE.NDYRT(KQ))GO TO 1237
  167.  1236        CONTINUE
  168.              STOP 'WETHR-1:DAY OF YR BAD ON TAPE40'
  169.  1237        IMO=KQ
  170.              ENDIF
  171.           TIME41=TOD()
  172.           IF(LASTDAY.NE.ITIME(1)) IDAY41=IDAY41+1
  173.           IF(IDAY41.GT.7) THEN
  174.                IDAY41=1
  175.           ENDIF
  176.           IF(WDATA(3).LT.SMALL) WDATA(3)=SMALL
  177.           DO 1240 I=1,ICODE
  178.           IF(ABS(WDATA(I)).GE.BAD) WDATA(I)=WDOLD(I)
  179.           IF(ABS(WDATA(I)).LT.SMALL) WDATA(I)=SMALL
  180.  1240     CONTINUE
  181.           IF(WDATA(3).LT.0.0) WDATA(3)=SMALL
  182.           IF(WDATA(6).LT.5.0) WDATA(6)=0.0
  183.           IF(WDATA(15).GT.WDATA(8)) WDATA(15)=WDATA(8)-.1
  184.           IF(ICODE.GE.15) THEN
  185. C                        SET SPECIFIC HUMIDITY (USE FUNCS FROM PSY)
  186.              PWSS = FPWS(WDATA(8))
  187.              WSS = FW22(PWSS)
  188.              W = FW35(WDATA(8),WDATA(15),WSS)
  189.           ENDIF
  190.           WDATA(15)=W
  191.           WRITE(41,200) IDAY41,TIME41,(WDATA(J),J=1,ICODE)
  192.              IF(INPRT1.NE.0)WRITE(60,510) IDAY41,TIME41,(WDATA(J),
  193.      +        J=1,ICODE)
  194. C
  195. C             SUMS FOR HOURLY  SOLAR AND ODDB 
  196.           DT=WTIME(2)-WTIME(1)
  197.           SDTDB=SDTDB+DT
  198.           SDTSF=SDTSF+DT
  199.           SDB=SDB+(WDATA(8)+WDOLD(8))/2.0 * DT
  200.           SSF=SSF+(WDATA(6)+WDOLD(6))/2.0 *DT
  201.           IF(LASTHR.EQ.ITIME(2)) GO TO 1230
  202.           LASTHR=ITIME(2)
  203.           IT2=ITIME(2)
  204.           ID=IDAY41
  205.           IF(IT2.EQ.0) THEN
  206.              IT2=24
  207.              ID=ID-1
  208.           ENDIF
  209. C  ID IS SEQUENCE DAY OF MONTH(1 TO NDAYM)--NOT CALENDAR DAY OF MONTH!!!
  210. C  IT2 IS HOUR OF DAY
  211. C  IMO IS ACTUAL MONTH OF YEAR
  212.           SOLARH(IT2)=SSF/SDTSF
  213.           ODDB(IT2) = SDB/SDTDB
  214.           IF(IDBG.NE.0)WRITE(60,501)ID,IT2,IMO,SOLARH(IT2)
  215.   501     FORMAT(1X,'WETHR:ID,IT2,IMO,SOLARH= ',3I5,G13.5)
  216.           SDTSF=0.0
  217.           SSF=0.0
  218.           SDB=0.
  219.           SDTDB=0.
  220.           IF(LASTDAY.EQ.ITIME(1)) GO TO 1230
  221.           WRITE(19,533)(SOLARH(IHR),IHR=1,24)
  222.           IF(IDAYDB.EQ.0)THEN
  223.             IDAYDB=1
  224.             SUM=0.
  225.             ITM=0
  226.             DO 1242 IHR = ITIM2,24
  227.             ITM=ITM+1
  228.             SUM=SUM+ODDB(IHR)
  229.  1242       CONTINUE
  230.             TODAVG = SUM / ITM
  231.             WRITE(60,*)' TODAVG (OF ACTUAL DATA) = ',TODAVG
  232.             WRITE(60,*)' 1ST DAY ODDB VALUES BELOW'
  233.             WRITE(60,533)(ODDB(IHR),IHR=1,24)
  234.           ENDIF
  235.           LASTDAY=ITIME(1)
  236.           GO TO 1230
  237. C
  238. C             FINISH OFF LAST DAY (ITIME(2) TO 24.1)
  239.  1250     CONTINUE
  240.           IEDAY=ITIME(1)-1
  241.           IF(IDAY41.EQ.1) STOP 'WETHR: LESS THAN 1 DAY OF DATA'
  242.           IF(TIME41.LT.1.0) GO TO 1290
  243.           DO 1252 I=1,ICODE
  244.           IF(ABS(WDATA(I)).LT.SMALL. OR.
  245.      +       ABS(WDATA(I)).GT.BAD     ) WDATA(I)=SMALL
  246.  1252     CONTINUE
  247.           DO 1255 I=ITIME(2),24
  248. C              USE VALUES FROM PREV DAY FOR SOLARH          
  249.              IF(IDBG.NE.0)WRITE(60,502)IDAY41,I,IMO,SOLARH(I)
  250.   502        FORMAT(1X,'WETHR:IDAY41,I,IMO,SOLARH= ',3I5,G13.5)
  251.              TIME41=FLOAT(I)+1.0001
  252.              ID=IDAY41
  253.              IF(TIME41.GT.17.)WDATA(6)=0.
  254.                  IF(TIME41.GT.24.) THEN
  255.                     TIME41=TIME41-24.
  256.                     ID=IDAY41+1
  257.                  ENDIF
  258.                  WRITE(41,200) ID,TIME41,
  259.      +            (WDATA(J),J=1,ICODE)
  260.           IF(INPRT1.NE.0) WRITE(60,510)ID,TIME41,(WDATA(J),J=1,ICODE)
  261.  1255        CONTINUE
  262.           WRITE(19,533)(SOLARH(IHR),IHR=1,24)
  263. C
  264.  1290     CONTINUE
  265. C
  266. C             SET UP FOR SUBSEQUENT READINGS
  267.  1292     CONTINUE
  268.           REWIND 19
  269.           REWIND 41
  270.           IPOS=2
  271.           DO 1295 I=1,IPOS
  272.            READ(41,200,IOSTAT=IEOF41) IDAY41,TIME41,
  273.      +         (WDATA(J),J=1,ICODE)
  274.            IF(IEOF41.LT.0) STOP 'EOF ON 41 IN WETHR NEAR 1295'
  275.            WTIME(I)=TIME41
  276.            ODDB(I)=WDATA(8)
  277.            WIND(I)=WDATA(3)
  278.            ODHUM(I)=WDATA(15)
  279.            TGAR(I)=WDATA(10)
  280.  1295     CONTINUE
  281.           IF(WTIME(1).GT.WTIME(2)) WTIME(2)=WTIME(2)+24.
  282.           LASTDAY=0
  283.           RETURN
  284. C
  285.           ENDIF
  286.          STOP 'BAD NSEQW IN WETHR BLOCK 1'
  287. C
  288. C =====================================================================
  289. C *** BLOCK 2: READ IN OTHER DATA
  290. C              TEMP,(HUM,WETB),WIND   (DO NOTHING BLOCK!  RDF)
  291. C
  292.  2000 CONTINUE
  293. C
  294.       IF(NSEQW.EQ.0) THEN
  295. C        INSTALL CARRIER TAPE DATA CODE
  296.          STOP 'WETHR ERROR 2.0'
  297. C
  298.       ELSE IF(NSEQW.EQ.1) THEN
  299. C        INSTALL SEQUENTIAL TAPE40 CODE
  300.          STOP 'SETHR ERROR 2.1'
  301. C
  302.       ELSE IF(NSEQW.EQ.2) THEN
  303.          RETURN
  304. C
  305.       ELSE
  306.          STOP 'BAD NSEQW IN WETHR BLOCK 2'
  307. C
  308.       ENDIF
  309. C
  310. C =====================================================================
  311. C *** BLOCK 3: MEAN DAY/AVERAGES/INTERPOLATION (DO NOTHING BLOCK! RDF)
  312. C
  313.  3000 CONTINUE
  314. C
  315.       IF(NSEQW.EQ.0.OR.NSEQW.EQ.1) THEN
  316. C        INSTALL MEAN DAY/AVE AND INTER CODE
  317.          STOP 'WETHR ERROR 3.0 & 3.1'
  318. C
  319.       ELSE IF(NSEQW.EQ.2)THEN
  320. C        TODAVG = ODDBAV(IDAY41,IMO)    NOW CALC ON 1ST CALL TO WETHR!
  321.         RETURN
  322. C        
  323.       ELSE
  324.          STOP 'BAD NSEQW IN WETHR BLOCK 3'
  325. C
  326.       ENDIF
  327.  
  328. C
  329. C =====================================================================
  330. C *** BLOCK 4: INITIALIZE DATA FOR A NEW HOUR
  331. C
  332.  4000 CONTINUE
  333. C
  334.       IF(NSEQW.EQ.0.OR.NSEQW.EQ.1) THEN
  335. C        SUBTRACT DXXX(I) FROM XXX(I) TO PREPARE TO STEP
  336. C        TO THE FIRST TIME STEP IN THE HOUR
  337.          STOP 'WETHR ERROR 4.0 & 4.1'
  338. C
  339.       ELSE IF(NSEQW.EQ.2) THEN
  340. C
  341.           IF(IDAY41.EQ.LASTDAY) THEN
  342.             IF(FLOAT(IT).LT.WTIME(IPOS)) RETURN
  343.           ELSE
  344.             IF(WTIME(IPOS).GT.25.) THEN
  345.                      DO 4002 I=1,IPOS
  346.                         WTIME(I)=WTIME(I)-24.
  347.  4002                CONTINUE
  348.                      LOCIT=1
  349.                      LASTDAY=IDAY41
  350.                      RETURN
  351.             ENDIF
  352.           ENDIF
  353. C
  354.          DO 4210 I=1,2
  355.             J=IPOS-2+I
  356.             WTIME(I)=WTIME(J)
  357.             IF(IDAY41.NE.LASTDAY) WTIME(I)=WTIME(I)-24.
  358.             ODDB(I)=ODDB(J)
  359.             WIND(I)=WIND(J)
  360.             ODHUM(I)=ODHUM(J)
  361.             TGAR(I)=TGAR(J)
  362.  4210    CONTINUE
  363.          LASTDAY=IDAY41
  364. C
  365.          IPOS=3
  366.          LOCIT=1
  367.  4220    CONTINUE
  368.          READ(41,200,IOSTAT=IEOF41) IDAY41,TIME41,
  369.      +       (WDATA(I),I=1,ICODE)
  370.           IF(IEOF41.LT.0) THEN
  371.              WRITE(60,*) ' '
  372.              WRITE(60,*) 'NO MORE WEATHER DATA',IDAY41,TIME41,IT,TIME
  373.              RETURN
  374.           ENDIF
  375.           WTIME(IPOS)=TIME41
  376.          ODDB(IPOS)=WDATA(8)
  377.          WIND(IPOS)=WDATA(3)
  378.          ODHUM(IPOS)=WDATA(15)
  379.          TGAR(IPOS)=WDATA(10)
  380.          IF(TIME41.GT.FLOAT(IT).OR.IDAY41.NE.LASTDAY) GO TO 4230
  381.          IPOS=IPOS+1
  382.          LASTDAY=IDAY41
  383.          GO TO 4220
  384.  4230    CONTINUE
  385.          IF(IDAY41.NE.LASTDAY) WTIME(IPOS)=WTIME(IPOS)+24.
  386.           RETURN
  387. C
  388. C
  389.           ENDIF
  390.          STOP 'BAD NSEQW IN WETHR BLOCK 4'
  391. C
  392. C =====================================================================
  393. C *** BLOCK 5: STEP WEATHER DATA WITHIN A TIME STEP
  394. C
  395.  5000 CONTINUE
  396. C
  397.       IF(NSEQW.EQ.0.OR.NSEQW.EQ.1) THEN
  398. C        STEP DATA AND CALC WEATHER PARAMETERS
  399.          STOP 'WETHR:ERROR 5.0&5.1'
  400. C
  401.       ELSE IF(NSEQW.EQ.2) THEN
  402.          DO 5205 I=LOCIT,(IPOS-1)
  403.              IF(WTIME(I).LE.TIME.AND.TIME.LE.WTIME(I+1))
  404.      +        GO TO 5210
  405.  5205    CONTINUE
  406.          I=IPOS-1
  407.  5210    CONTINUE
  408.          IF(IPCOOL.EQ.1)THEN
  409.            IF(FIRST45) THEN
  410.              OPEN(45,FILE='TAPE45',STATUS='NEW',IOSTAT=IO45)
  411.              IF(IO45.NE.0)THEN
  412.                WRITE(60,*)' WETHR: CANT OPEN TAPE45 W/ ATTCHD SPC TEMP'
  413.                STOP ' WETHR: CANT OPEN TAPE45 W/ ATTCHD SPC TEMP'
  414.              ENDIF
  415. C  TX  - TIME OF DAY AT NEXT READING OF TPC, HR  (?? WEIRD! RDF)
  416. C  TPC - ATTACHED UNCONDITIONED SPACE TEMP, F
  417.              READ(45,*) TX,TPC
  418.              FIRST45=.FALSE.
  419.            ENDIF
  420.            IF(TIME.GT.TX.AND.I45.EQ.0) THEN
  421.              READ(45,*,END=5300) TX,TPC
  422.            ENDIF
  423.          ENDIF
  424.  5250    TPCOOL=TPC
  425.          LOCIT=I
  426.          WODHUM=XINTER(WTIME(LOCIT),ODHUM(LOCIT),
  427.      +              WTIME(LOCIT+1),ODHUM(LOCIT+1),TIME)
  428.          WSPED=XINTER(WTIME(LOCIT),WIND(LOCIT),
  429.      +              WTIME(LOCIT+1),WIND(LOCIT+1),TIME)
  430.          TODDB=XINTER(WTIME(LOCIT),ODDB(LOCIT),
  431.      +              WTIME(LOCIT+1),ODDB(LOCIT+1),TIME)
  432.          IF(ICODE.GT.9) THEN
  433.             TGARAG=XINTER(WTIME(LOCIT),TGAR(LOCIT),
  434.      +              WTIME(LOCIT+1),TGAR(LOCIT+1),TIME)
  435.          ELSE
  436.             TGARAG=TODDB
  437.          ENDIF
  438.           RETURN
  439.  5300    I45=1
  440.          GO TO 5250
  441.  
  442. C
  443.       ELSE
  444.          STOP 'BAD NSEQW IN WETHR BLOCK 5'
  445. C
  446.       ENDIF
  447. C ***
  448.   100 FORMAT(F12.5,I4,5I3,I5/(8E10.4))
  449.   110 FORMAT(7G10.4)
  450.   200 FORMAT(I2,G14.7,10(E11.4))
  451.   500 FORMAT('1MEASURED WEATHER DATA',F12.5,7I5/
  452.      +    ' DAY       HOUR',10(' ---CH ',I2,'--') )
  453.   510 FORMAT(I4,F11.5,(10G11.3))
  454. C
  455.   533 FORMAT(1X,6G13.5/1X,6G13.5/1X,6G13.5/1X,6G13.5)
  456.       END
  457.