PROGRAM POLANL C .IDENT \X01.16\ C C Template for pool monitor logging file analysis program C C C ====================================================================== C Define the data structures C ====================================================================== C Implicit COMPLEX (A - Z) ! Screw the undefined symbols Byte DATE ! ASCII date of sample Byte FDATE ! First ASCII date Byte LDATE ! Last ASCII date Byte PLLINE ! Pseudoplotted output line Integer*2 ARPOS ! Index into arrays Integer*2 DANPOL ! Dangerous pool change value Integer*2 DAY ! ASCII day of the week Integer*2 FHOUR ! Hour of first sample Integer*2 FMINUT ! Minute of first sample Integer*2 HISTLM ! Current histogram limit value Integer*2 HOUR ! Hour of sample Integer*2 ICOUNT ! Number of samples per cell Integer*2 IDAY ! Integer day of the week Integer*2 IMPPOL ! Impressive pool change value Integer*2 INTRVL ! Interval on plot y axis Integer*2 ITIME ! Integer time within day Integer*2 IRAW ! Raw data array Integer*2 IT ! Temporary array Integer*2 IT1 ! Temporary / fragments Integer*2 IT2 ! Temporary / second largest Integer*2 IT3 ! Temporary / largest Integer*2 IT4 ! Temporary / free pool Integer*2 IT5 ! Temporary / act tasks Integer*2 ITOTLS ! Number of samples per day Integer*2 LHOUR ! Hour of last sample Integer*2 LMINUT ! Minute of last sample Integer*2 LOOP1 ! DO loop index Integer*2 LOOP2 ! DO loop index Integer*2 LOOP3 ! DO loop index Integer*2 LOOP4 ! DO loop index Integer*2 MASPOL ! Massive pool change value Integer*2 MINUTE ! Minute of sample Integer*2 SIGPOL ! Significant pool change value Integer*2 UPRLIM ! Blocked highest limit of POOL Integer*2 WKDAY ! ASCII day of week table Logical*1 FIRST ! First date/time taken Real COUNT ! Number samples taken on a day Real CRUDE ! Low, high, sum, sum of squares Real FT0 ! Temporary Real FT1 ! Temporary Real ITEM ! Temporary for examined entry C C ====================================================================== C DIMENSION the data arrays C ====================================================================== C Dimension IRAW (7, 288, 5), ICOUNT (7, 288), DATE (9) Dimension ITOTLS (8), CRUDE (8, 5, 5), FDATE (9), LDATE (9) Dimension WKDAY (7), PLLINE (100), IT (5) C C ====================================================================== C DATA statements C ====================================================================== C Data WKDAY /'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'/ C C C ====================================================================== C FORMAT Statements C ====================================================================== C 9999 Format (A2, 2X, 9A1, 1X, I2, 1X, I2, 5X, 5(I5, 1X)) D9998 Format (1X, A2, 1X, 9A1, 1X, I2, 1H:, I2, 1X, 1H(, I1, 1H,, I3, D + 1H), 2X, 5(I5, 1X)) 9997 Format (1X, 'Initializing arrays ... please wait') 9996 Format (1X, 'Reading raw data into storage ... please wait') 9994 Format (1X, 'Analyzing data array ... please wait') 9993 Format (A1, 47X, 'RSX POOL Monitoring Statistics Report', /, + 41X, 'for the period ', I2, 1H:, I2, 1X, 9A1, ' to ', I2, 1H:, + I2, 1X, 9A1) 9992 Format (/, 'Number of fragments') 9991 Format (' minimum ', F7.1, 7X, F7.1, 9X, + F7.1, 8X, F7.1, 6X, F7.1, 8X, F7.1, 6X, F7.1, 7X, F7.1) 9990 Format (' maximum ', F7.1, 7X, F7.1, 9X, + F7.1, 8X, F7.1, 6X, F7.1, 8X, F7.1, 6X, F7.1, 7X, F7.1) 9989 Format (' average ', F7.1, 7X, F7.1, 9X, + F7.1, 8X, F7.1, 6X, F7.1, 8X, F7.1, 6X, F7.1, 7X, F7.1) 9988 Format (' standard deviation ', F7.1, 7X, F7.1, 9X, + F7.1, 8X, F7.1, 6X, F7.1, 8X, F7.1, 6X, F7.1, 7X, F7.1) 9987 Format (//, 'Second largest fragment') 9986 Format (//, 'Largest fragment') 9985 Format (//, 'Total free POOL') 9984 Format (//, 'Active tasks in GEN') 9983 Format (' coeff. of variation ', F7.1, 7X, F7.1, 9X, + F7.1, 8X, F7.1, 6X, F7.1, 8X, F7.1, 6X, F7.1, 7X, F7.1) 9982 Format (//, 'Number of samples ', I5, 9X, I5, 11X, + I5, 10X, I5, 8X, I5, 10X, I5, 8X, I5, 9X, I5) 9981 Format (//, 26X, 'Monday', 7X, 'Tuesday', 7X, 'Wednesday', 7X, + 'Thursday', 7X, 'Friday', 7X, 'Saturday', 7X, 'Sunday', 7X, + 'Overall') 9980 Format ('Significant POOL change from ', I5, ' to ', I5, ' on ', + A2, ' at ', I2, 1H:, I2) 9979 Format (/, '"Significant" changes in POOL are defined as ', + 'changes of more than 20 percent', /, 'of the overall lowest ', + 'available POOL. ', //, 'For this run significant changes ', + 'are ', I4, ' or more.', //) 9978 Format ('Impressive POOL change from ', I5, ' to ', I5, ' on ', + A2, ' at ', I2, 1H:, I2) 9977 Format (/, '"Impressive" changes in POOL are defined as ', + 'changes of more than 30 percent', /, 'of the overall lowest ', + 'available POOL. ', //, 'For this run impressive changes ', + 'are ', I4, ' or more.') 9976 Format ('Massive POOL change from ', I5, ' to ', I5, ' on ', + A2, ' at ', I2, 1H:, I2) 9975 Format (/, '"Massive" changes in POOL are defined as ', + 'changes of more than 40 percent', /, 'of the overall lowest ', + 'available POOL. ', //, 'For this run massive changes ', + 'are ', I4, ' or more.') 9974 Format ('Dangerous POOL change from ', I5, ' to ', I5, ' on ', + A2, ' at ', I2, 1H:, I2) 9973 Format (//, '"Dangerous" changes in POOL are defined as ', + 'changes of more than 50 percent', /, 'of the overall lowest ', + 'available POOL. ', //, 'For this run dangerous changes ', + 'are ', I4, ' or more.') 9972 Format (7X, 1H|, 96A1) 9971 Format (I5, 2X, 1H+, 96A1) 9970 Format (4X, '0', 2X, 1H+, 24('+---'), //, + 8X, 10('0', 3X), 10('1', 3X), 4('2', 3X), /, 8X, + 2('0', 3X, '1', 3X, '2', 3X, '3', 3X, '4', 3X, '5', 3X, '6', 3X, + '7', 3X, '8', 3X, '9', 3X), '0', 3X, '1', 3X, '2', 3X, '3') 9969 Format (//, A2, /) C C ====================================================================== C The Code C ====================================================================== C C C Initialize the data virtual array and the count array C C C C Initialize the data analysis arrays C Write (5, 9997) Do 40 LOOP1 = 1, 8, 1 ITOTLS(LOOP1) = 0 Do 50 LOOP2 = 1, 5, 1 CRUDE(LOOP1, LOOP2, 1) = 1.0E6 CRUDE(LOOP1, LOOP2, 2) = -1.0E6 CRUDE(LOOP1, LOOP2, 3) = 0.0 CRUDE(LOOP1, LOOP2, 4) = 0.0 50 Continue 40 Continue Do 10 LOOP1 = 1, 7, 1 Do 20 LOOP2 = 1, 288, 1 IRAW(LOOP1, LOOP2, 1) = 0 IRAW(LOOP1, LOOP2, 2) = 0 IRAW(LOOP1, LOOP2, 3) = 0 IRAW(LOOP1, LOOP2, 4) = 0 IRAW(LOOP1, LOOP2, 5) = 0 ICOUNT(LOOP1, LOOP2) = 0 20 Continue 10 Continue C C C Open the log file LB:[1,4]POOLMN.LOG shared C Open (File='LB:[1,4]POOLMN.DAT', Status='OLD', Shared, Readonly, + Unit=1) C C C Read the log file into the data array and update the count array C Write (5, 9996) FIRST = .FALSE. 30 Read (1, 9999, End=100, Err=200) DAY, DATE, HOUR, MINUTE, IT(1), + IT(2), IT(3), IT(4), IT(5) If (FIRST) Goto 35 FHOUR = HOUR FMINUT = MINUTE Do 32 LOOP1 = 1, 9, 1 FDATE(LOOP1) = DATE(LOOP1) 32 Continue FIRST = .TRUE. 35 ARPOS = (HOUR * 12) + (MINUTE / 5) + 1 IDAY = 1 If (DAY .EQ. 'Tu') IDAY = 2 If (DAY .EQ. 'We') IDAY = 3 If (DAY .EQ. 'Th') IDAY = 4 If (DAY .EQ. 'Fr') IDAY = 5 If (DAY .EQ. 'Sa') IDAY = 6 If (DAY .EQ. 'Su') IDAY = 7 D Write (5, 9998) DAY, DATE, HOUR, MINUTE, IDAY, ARPOS, IT(1), IT(2), D + IT(3), IT(4), IT(5) IRAW(IDAY, ARPOS, 1) = IRAW(IDAY, ARPOS, 1) + IT(1) IRAW(IDAY, ARPOS, 2) = IRAW(IDAY, ARPOS, 2) + IT(2) IRAW(IDAY, ARPOS, 3) = IRAW(IDAY, ARPOS, 3) + IT(3) IRAW(IDAY, ARPOS, 4) = IRAW(IDAY, ARPOS, 4) + IT(4) IRAW(IDAY, ARPOS, 5) = IRAW(IDAY, ARPOS, 5) + IT(5) ICOUNT(IDAY, ARPOS) = ICOUNT(IDAY, ARPOS) + 1 C Do 333 LOOP3 = 1, 5, 1 ITEM = FLOAT(IT(LOOP3)) If (ITEM .LT. CRUDE(IDAY, LOOP3, 1)) CRUDE(IDAY, LOOP3, 1) = ITEM If (ITEM .GT. CRUDE(IDAY, LOOP3, 2)) CRUDE(IDAY, LOOP3, 2) = ITEM CRUDE(IDAY, LOOP3, 3) = CRUDE(IDAY, LOOP3, 3) + ITEM CRUDE(IDAY, LOOP3, 4) = CRUDE(IDAY, LOOP3, 4) + (ITEM ** 2) If (ITEM .LT. CRUDE(8, LOOP3, 1)) CRUDE(8, LOOP3, 1) = ITEM If (ITEM .GT. CRUDE(8, LOOP3, 2)) CRUDE(8, LOOP3, 2) = ITEM CRUDE(8, LOOP3, 3) = CRUDE(8, LOOP3, 3) + ITEM CRUDE(8, LOOP3, 4) = CRUDE(8, LOOP3, 4) + (ITEM ** 2) 333 Continue Goto 30 C C C Read Error Handler C 200 Close (Unit=1, Dispose='SAVE') Call EXIT C C C File has been read in. Close it. C 100 Close (Unit=1, Dispose='SAVE') LHOUR = HOUR LMINUT = MINUTE Do 105 LOOP1 = 1, 9, 1 LDATE(LOOP1) = DATE(LOOP1) 105 Continue C C C Skip through data and find number samples per day and over entire week C Write (5, 9994) Do 60 LOOP1 = 1, 7, 1 Do 70 LOOP2 = 1, 288, 1 If (ICOUNT(LOOP1, LOOP2) .EQ. 0) Goto 70 ITOTLS(LOOP1) = ITOTLS(LOOP1) + ICOUNT(LOOP1, LOOP2) ITOTLS(8) = ITOTLS(8) + ICOUNT(LOOP1, LOOP2) 70 Continue 60 Continue C C C Do a quickie calculation of the mean and standard deviation C Do 160 LOOP1 = 1, 8, 1 Do 180 LOOP3 = 1, 5, 1 If (ITOTLS(LOOP1) .EQ. 0) Goto 180 COUNT = FLOAT(ITOTLS(LOOP1)) CRUDE(LOOP1, LOOP3, 4) = SQRT(((COUNT * CRUDE(LOOP1, LOOP3, 4)) - + (CRUDE(LOOP1, LOOP3, 3) ** 2)) / ((COUNT ** 2) - COUNT)) CRUDE(LOOP1, LOOP3, 3) = CRUDE(LOOP1, LOOP3, 3) / COUNT CRUDE(LOOP1, LOOP3, 5) = (CRUDE(LOOP1, LOOP3, 4) * 100.0) / + CRUDE(LOOP1, LOOP3, 3) 180 Continue 160 Continue C C C Put outrageous values into empty positions to force asterisk fields C Do 260 LOOP1 = 1, 8, 1 Do 280 LOOP3 = 1, 5, 1 If (CRUDE(LOOP1, LOOP3, 1) .LE. 0.1) CRUDE(LOOP1, LOOP3, 1) = 1.0E6 If (CRUDE(LOOP1, LOOP3, 2) .LE. 0.1) CRUDE(LOOP1, LOOP3, 2) = 1.0E6 If (CRUDE(LOOP1, LOOP3, 3) .LE. 0.1) CRUDE(LOOP1, LOOP3, 3) = 1.0E6 If (CRUDE(LOOP1, LOOP3, 4) .LE. 0.1) CRUDE(LOOP1, LOOP3, 4) = 1.0E6 If (CRUDE(LOOP1, LOOP3, 5) .LE. 0.1) CRUDE(LOOP1, LOOP3, 5) = 1.0E6 280 Continue 260 Continue C C C Open the output file POOLANAL.LOG C Open (File='SY:POOLANAL.LOG', Status='NEW', Carriagecontrol='LIST', + Unit=1) C C C Dump the data on the user C Call ERRSET (63, .TRUE., .FALSE., .FALSE., .FALSE., 32) Write (1, 9993) '14'O, FHOUR, FMINUT, (FDATE(LOOP1), LOOP1=1,9), + LHOUR, LMINUT, (LDATE(LOOP2), LOOP2=1,9) Write (1, 9981) Write (1, 9992) Write (1, 9991) (CRUDE(LOOP1, 1, 1), LOOP1=1, 8) Write (1, 9990) (CRUDE(LOOP1, 1, 2), LOOP1=1, 8) Write (1, 9989) (CRUDE(LOOP1, 1, 3), LOOP1=1, 8) Write (1, 9988) (CRUDE(LOOP1, 1, 4), LOOP1=1, 8) Write (1, 9983) (CRUDE(LOOP1, 1, 5), LOOP1=1, 8) Write (1, 9987) Write (1, 9991) (CRUDE(LOOP1, 2, 1), LOOP1=1, 8) Write (1, 9990) (CRUDE(LOOP1, 2, 2), LOOP1=1, 8) Write (1, 9989) (CRUDE(LOOP1, 2, 3), LOOP1=1, 8) Write (1, 9988) (CRUDE(LOOP1, 2, 4), LOOP1=1, 8) Write (1, 9983) (CRUDE(LOOP1, 2, 5), LOOP1=1, 8) Write (1, 9986) Write (1, 9991) (CRUDE(LOOP1, 3, 1), LOOP1=1, 8) Write (1, 9990) (CRUDE(LOOP1, 3, 2), LOOP1=1, 8) Write (1, 9989) (CRUDE(LOOP1, 3, 3), LOOP1=1, 8) Write (1, 9988) (CRUDE(LOOP1, 3, 4), LOOP1=1, 8) Write (1, 9983) (CRUDE(LOOP1, 3, 5), LOOP1=1, 8) Write (1, 9985) Write (1, 9991) (CRUDE(LOOP1, 4, 1), LOOP1=1, 8) Write (1, 9990) (CRUDE(LOOP1, 4, 2), LOOP1=1, 8) Write (1, 9989) (CRUDE(LOOP1, 4, 3), LOOP1=1, 8) Write (1, 9988) (CRUDE(LOOP1, 4, 4), LOOP1=1, 8) Write (1, 9983) (CRUDE(LOOP1, 4, 5), LOOP1=1, 8) Write (1, 9984) Write (1, 9991) (CRUDE(LOOP1, 5, 1), LOOP1=1, 8) Write (1, 9990) (CRUDE(LOOP1, 5, 2), LOOP1=1, 8) Write (1, 9989) (CRUDE(LOOP1, 5, 3), LOOP1=1, 8) Write (1, 9988) (CRUDE(LOOP1, 5, 4), LOOP1=1, 8) Write (1, 9983) (CRUDE(LOOP1, 5, 5), LOOP1=1, 8) Write (1, 9982) (ITOTLS(LOOP1), LOOP1=1, 8) C C C Look for massive, impressive and significant changes in total POOL C Write (1, 9993) '14'O, FHOUR, FMINUT, (FDATE(LOOP1), LOOP1=1,9), + LHOUR, LMINUT, (LDATE(LOOP2), LOOP2=1,9) DANPOL = INT((CRUDE(8, 4, 1) * 0.5) + 0.5) Write (1, 9973) DANPOL MASPOL = INT((CRUDE(8, 4, 1) * 0.4) + 0.5) Write (1, 9975) MASPOL IMPPOL = INT((CRUDE(8, 4, 1) * 0.3) + 0.5) Write (1, 9977) IMPPOL SIGPOL = INT((CRUDE(8, 4, 1) * 0.2) + 0.5) Write (1, 9979) SIGPOL Do 340 LOOP1 = 1, 7, 1 Do 350 LOOP2 = 2, 288, 1 IT2 = ICOUNT(LOOP1, LOOP2-1) IT4 = ICOUNT(LOOP1, LOOP2) If ((IT2 .EQ. 0) .OR. (IT4 .EQ. 0)) Goto 350 IT1 = IRAW(LOOP1, LOOP2-1, 4) IT3 = IRAW(LOOP1, LOOP2, 4) IT1 = INT((FLOAT(IT1) / FLOAT(IT2)) + 0.5) IT3 = INT((FLOAT(IT3) / FLOAT(IT4)) + 0.5) IT4 = IABS(IT1 - IT3) HOUR = ((LOOP2 - 1) / 12) + 1 MINUTE = ((LOOP2 - 1) - ((HOUR - 1) * 12)) * 5 If (IT4 .LT. DANPOL) Goto 353 Write (1, 9974) IT1, IT3, WKDAY(LOOP1), HOUR, MINUTE Goto 350 353 If (IT4 .LT. MASPOL) Goto 352 Write (1, 9976) IT1, IT3, WKDAY(LOOP1), HOUR, MINUTE Goto 350 352 If (IT4 .LT. IMPPOL) Goto 351 Write (1, 9978) IT1, IT3, WKDAY(LOOP1), HOUR, MINUTE Goto 350 351 If (IT4 .LT. SIGPOL) Goto 350 Write (1, 9980) IT1, IT3, WKDAY(LOOP1), HOUR, MINUTE 350 Continue 340 Continue C C C Pseudoplot the available POOL for each day of the week. C UPRLIM = INT((AINT(CRUDE(8, 4, 2) / 1000.0)) * 1000.0) + 1000 INTRVL = UPRLIM / 50 Do 420 LOOP4 = 1, 7, 1 Write (1, 9993) '14'O, FHOUR, FMINUT, (FDATE(LOOP1), LOOP1=1,9), + LHOUR, LMINUT, (LDATE(LOOP2), LOOP2=1,9) Write (1, 9969) WKDAY(LOOP4) HISTLM = UPRLIM Do 410 LOOP2 = 0, 49, 1 Do 400 LOOP1 = 1, 96, 1 PLLINE(LOOP1) = '40'O IT2 = ((LOOP1 - 1) * 3) + 1 FT0 = FLOAT(IRAW(LOOP4, IT2, 4)) + FLOAT(IRAW(LOOP4, IT2+1, 4)) + + FLOAT(IRAW(LOOP4, IT2+2, 4)) IT4 = ICOUNT(LOOP4, IT2) + ICOUNT(LOOP4, IT2+1) + ICOUNT(LOOP4, IT2+2) If (IT4 .EQ. 0) Goto 400 IT3 = INT(FT0 / FLOAT(IT4)) If ((IT3 .GE. HISTLM) .AND. ((IT3 - HISTLM) .LT. INTRVL)) + PLLINE(LOOP1) = '170'O 400 Continue IT1 = LOOP2 - ((LOOP2 / 10) * 10) If (IT1 .EQ. 0) Write (1, 9971) HISTLM, (PLLINE(LOOP3), LOOP3=1, 96) If (IT1 .NE. 0) Write (1, 9972) (PLLINE(LOOP3), LOOP3=1, 96) HISTLM = HISTLM - INTRVL 410 Continue Write (1, 9970) 420 Continue C C C Output file has been completely written. Close it. C Close (Unit=1, Dispose='SAVE') C C C Other data analysis routines may be dropped in here as desired C but for now, we just ... C Call EXIT End