SUBROUTINE RDTRAC $INCLUDE:"PARAM.INC" $INCLUDE:"SCOM1.COM" C $INCLUDE:"UCOM.FOR" C C ROUTINE TO READ AN EVENT FROM THE TRACE C C CHARACTER*1 ICODE CHARACTER*80 LINE C C FIND THE MINIMUM TIME AND USE THAT RECORD C CALL FINDMIN(IFILEMIN, TIMEMIN) C C READ UNTIL THE END MARKER IN THE FILE C IF(IFILEMIN.NE.0) THEN LINE = RECORD (IFILEMIN) BASELINE = BASETIME(IFILEMIN) ICODE = ' ' IRET1 = 1 DO WHILE (IRET1.EQ.1) READ (IFILEMIN+25, FMT='(A80)') RECORD(IFILEMIN) C IF (RECORD(IFILEMIN)(1:4).EQ.'END.') THEN IRET1 = 2 CLOSE(IFILEMIN+25) IBASE = (ICACHE(IFILEMIN)-1)*8 + 40 WRITE(IBASE+7,FMT="(1X,A40,T50,F10.0)") 1 FILENAME(IFILEMIN), PMNUM(5,ICACHE(IFILEMIN))+1.0 CALL SETFILE(IFILEMIN+30, ICODE) IF (ICODE.NE.'E') THEN IRET = 1 DO WHILE (IRET.EQ.1) READ (IFILEMIN+25, FMT='(A80)') RECORD(IFILEMIN) CALL PRTRAC(RECORD(IFILEMIN), CURTIME(IFILEMIN), 1 ATRIB, IRET) END DO C C TIME IS IN INTEGER. UNITS ARE ADJUSTED TO SECONDS BY SF C CURTIME(IFILEMIN) = 1 CURTIME(IFILEMIN) / SF + BASETIME(IFILEMIN) ELSE CURTIME(IFILEMIN) = -1.0 ENDIF ELSE CALL PRTRAC(RECORD(IFILEMIN), CURTIME(IFILEMIN), 1 ATRIB, IRET1) CURTIME(IFILEMIN) = 1 CURTIME(IFILEMIN) / SF + BASETIME(IFILEMIN) ENDIF END DO C ICNTFL(ICACHE(IFILEMIN),1) = ICNTFL(ICACHE(IFILEMIN),1) + 1 CALL PRTRAC(LINE, TIME, ATRIB, IRET) C C TIME IS IN INTEGER. UNITS ARE ADJUSTED TO SECONDS BY SF C TIME = TIME / SF + BASELINE C C IS FILE ON CAMPUS C ATRIB(11) = IS_CAMP(IFIX(ATRIB(1)), IFILEMIN) C C IS FILE OF AN ACCEPTABLE TYPE C ATRIB(12) = IS_TYPE(IFIX(ATRIB(4)), IFILEMIN) C C ASSIGN CACHE ATRIB C ATRIB(16) = ICACHE(IFILEMIN) C IF (FILES(6).NE.'NONE') THEN C C THERE IS A TIME FILE C READ (22, FMT='(A80)') LINE IF (LINE(1:4).NE.'END.') THEN C C READ UNTIL END MARKER IN FILE C PARSE RECORD FOR START TIME, FILE SIZE, AND TRANSFER RATE C ICNTFL(ICACHE(IFILEMIN),2) = ICNTFL(ICACHE(IFILEMIN),2) + 1 IEND = INDEX(LINE, ' <') IF (VERIFY(LINE(1:IEND-1),'1234567890.+- ').NE.0) THEN WRITE (*,*) 'TIME FILE RECORD IN ERROR: ', LINE CALL WS_ERROR(126,'F') ENDIF READ (LINE(1:IEND-1), FMT='(F10.0)') TIME1 TIME1 = TIME1 / SF C ISTART = IEND + 2 IEND = INDEX(LINE(ISTART:80),',') IF 1 (VERIFY(LINE(ISTART:ISTART-1+IEND-1),'1234567890.+- ').NE.0) 1 THEN WRITE (*,*) 'TIME FILE RECORD IN ERROR: ', LINE CALL WS_ERROR(127,'F') ENDIF READ (LINE(ISTART:ISTART-1+IEND-1), FMT='(F10.0)') ADUM C ISTART = ISTART + IEND + 1 IEND = INDEX(LINE(ISTART:80),',') IF 1 (VERIFY(LINE(ISTART:ISTART-1+IEND-1),'1234567890.+- ').NE.0) 1 THEN WRITE (*,*) 'TIME FILE RECORD IN ERROR: ', LINE CALL WS_ERROR(128,'F') ENDIF READ (LINE(ISTART:ISTART-1+IEND-1), FMT='(F10.0)') ATRIB(7) C C ONLY IF TIME IS IN THE SPECIFIED RANGE C IF (TIME.GE.START .AND. TIME.LE.END) THEN CALL SCHDL(1, TIME - TNOW, ATRIB) ELSE CALL SCHDL(7, 0.0, ATRIB) ENDIF C ENDIF ELSE C C NO TIME FILE USE CONSTANT TRANSFER RATE C ONLY IF TIME IS IN THE SPECIFIED RANGE C IF (TIME.GE.START .AND. TIME.LE.END) THEN ATRIB(7) = 1867.0 CALL SCHDL(1, TIME - TNOW, ATRIB) ELSE CALL SCHDL(7, 0.0, ATRIB) ENDIF ENDIF ENDIF C RETURN END C SUBROUTINE PRTRAC (LINE, TIME, A, IRET) C C ROUTINE TO PARSE A LINE FROM THE TRACE C TIME, SITE ID, FILE SIZE, FILE ID, MEDIA FORMAT, HIT OR MISS C $INCLUDE:"UCOM.FOR" C CHARACTER*80 LINE DIMENSION A(5) C IRET = 2 C IEND = INDEX(LINE, ' <') IF (VERIFY(LINE(1:IEND-1),'1234567890.+- ').NE.0) THEN WRITE (*,*) 'LOG FILE RECORD IN ERROR: ', LINE CALL WS_ERROR(131,'F') ENDIF READ (LINE(1:IEND-1), FMT='(F10.0)') TIME C ISTART = IEND+2 IEND = INDEX(LINE(ISTART:80),' ,') IF (VERIFY(LINE(ISTART:ISTART-1+IEND-1),'1234567890.+- ').NE.0) 1 THEN WRITE (*,*) 'LOG FILE RECORD IN ERROR: ', LINE CALL WS_ERROR(132,'F') ENDIF READ (LINE(ISTART:ISTART-1+IEND-1), FMT='(F10.0)') A(1) C ISTART = ISTART + IEND + 1 IEND = INDEX(LINE(ISTART:80),' ,') IF (VERIFY(LINE(ISTART:ISTART-1+IEND-1),'1234567890.+- ').NE.0) 1 THEN WRITE (*,*) 'LOG FILE RECORD IN ERROR: ', LINE CALL WS_ERROR(133,'W') IRET = 1 ICNTFL(1,3) = ICNTFL(1,3) + 1 ELSE READ (LINE(ISTART:ISTART-1+IEND-1), FMT='(F10.0)') A(2) IF (A(2).EQ.0.0) THEN IRET = 1 A(2) = 1.0 ICNTFL(1,3) = ICNTFL(1,3) + 1 ENDIF ENDIF C ISTART = ISTART + IEND + 1 IEND = INDEX(LINE(ISTART:80),' ,') IF (VERIFY(LINE(ISTART:ISTART-1+IEND-1),'1234567890.+- ').NE.0) 1 THEN WRITE (*,*) 'LOG FILE RECORD IN ERROR: ', LINE CALL WS_ERROR(134,'F') ENDIF READ (LINE(ISTART:ISTART-1+IEND-1), FMT='(F10.0)') A(3) C ISTART = ISTART + IEND + 1 IEND = INDEX(LINE(ISTART:80),' ,') IF (VERIFY(LINE(ISTART:ISTART-1+IEND-1),'1234567890.+- ').NE.0) 1 THEN WRITE (*,*) 'LOG FILE RECORD IN ERROR: ', LINE CALL WS_ERROR(135,'F') ENDIF READ (LINE(ISTART:ISTART-1+IEND-1), FMT='(F10.0)') A(4) C ISTART = ISTART + IEND + 1 IEND = INDEX(LINE(ISTART:80),' >') IF (VERIFY(LINE(ISTART:ISTART-1+IEND-1),'1234567890.+- ').NE.0) 1 THEN WRITE (*,*) 'LOG FILE RECORD IN ERROR: ', LINE CALL WS_ERROR(136,'F') ENDIF READ (LINE(ISTART:ISTART-1+IEND-1), FMT='(F10.0)') A(5) C RETURN END C SUBROUTINE PUTRACE (LUNIT, TIME, FILEID, PM) C C ROUTINE TO OUTPUT A ROW TO A TRACE FILE C C INPUTS: C LUNIT = ID NUMBER OF THE LOGICAL UNIT OF THE FILE C TIME = CURRENT SIMULATION TIME C FILEID(4) = SERVER ID, FILE SIZE, FILE NAME CODE, MEDIA TYPE C PM = PERFORMANCE MEASURE TO OUTPUT C $INCLUDE:"PARAM.INC" $INCLUDE:"SCOM1.COM" $INCLUDE:"UCOM.FOR" C DIMENSION FILEID(4) C CHARACTER*80 LINE C IF (LUNIT.NE.40.AND.TRACES(MOD(LUNIT-40,8)).NE.'Y') RETURN IF (XX(100).NE.2.0) RETURN LINE = ' ' WRITE(LINE(1:20),FMT="(F20.0)") TIME*SF WRITE(LINE(20:22),FMT="(3H < )") WRITE(LINE(23:27),FMT="(I5)") JFIX(FILEID(1)) WRITE(LINE(28:30),FMT="(3H , )") WRITE(LINE(31:38),FMT="(I8)") JFIX(FILEID(2)) WRITE(LINE(39:41),FMT="(3H , )") WRITE(LINE(42:46),FMT="(I5)") JFIX(FILEID(3)) WRITE(LINE(47:49),FMT="(3H , )") WRITE(LINE(50:54),FMT="(I5)") JFIX(FILEID(4)) WRITE(LINE(55:57),FMT="(3H , )") WRITE(LINE(58:69),FMT="(I12)") JFIX(PM) WRITE(LINE(70:71),FMT="(2H >)") LINE(72:72) = '\n'C C WRITE(LUNIT,FMT="(1X,A80)") LINE C RETURN END C FUNCTION IS_CAMP(ISOURCE, IFILE) C C ROUTINE TO DETERMINE IF A FILE IS ON CAMPUS OR NOT C $INCLUDE:"UCOM.FOR" C IS_CAMP = ISITES(IFILE,ISOURCE) RETURN END C SUBROUTINE SETFILE (LUNIT,ICODE) C $INCLUDE:"UCOM.FOR" C C ROUTINE TO SETUP THE NEXT FILE LIST FILE C CHARACTER*1 ICODE CHARACTER*80 LINE DIMENSION DELTIM(12) DATA DELTIM /2678400.0, 2678400.0, 2419200.0, 2678400.0, 1 2592000.0, 2678400.0, 2592000.0, 2678400.0, 2 2678400.0, 2592000.0, 2678400.0, 2592000.0/ C C FIND THE CURRENT MONTH FOR THIS FILE C LINE = FILENAME(LUNIT-30) ISTART = INDEX(LINE, '\', .TRUE.) MONCUR = NUM_MONTH(LINE(ISTART+1:ISTART+3)) C C READ DAY AND SET BASETIME C IF (VERIFY(LINE(ISTART+4:ISTART+5),'1234567890.+- ').NE.0) THEN WRITE (*,*) 'LIST OF LOG FILES FILE RECORD IN ERROR: ', LINE CALL WS_ERROR(141,'F') ENDIF READ (LINE(ISTART+4:ISTART+5), FMT="(I2)") IDAY BASETIME(LUNIT-30) = BASETIME(LUNIT-30) - 1 FLOAT(IDAY-1)*24.0*60.0*60.0 C C READ NEXT FILE NAME IF ANY C READ (LUNIT, FMT="(A80)") LINE FILENAME (LUNIT-30) = LINE ICODE = LINE(1:1) WRITE(*,*) LUNIT,' ',LINE IF (LINE(1:4).NE.'END.') THEN ISTART = INDEX(LINE, '\', .TRUE.) C C READ DAY C IF (VERIFY(LINE(ISTART+4:ISTART+5),'1234567890.+- ').NE.0) THEN WRITE (*,*) 'LIST OF LOG FILES FILE RECORD IN ERROR: ', LINE CALL WS_ERROR(141,'F') ENDIF READ (LINE(ISTART+4:ISTART+5), FMT="(I2)") IDAY C C MOVE TIME FORWARD TO CURRENT TIME C MONNEW = NUM_MONTH(LINE(ISTART+1:ISTART+3)) IF (MONNEW.GE.MONCUR) THEN DO 10 IMON = MONCUR+1, MONNEW BASETIME(LUNIT-30) = BASETIME(LUNIT-30) + DELTIM(IMON) 10 CONTINUE C ELSE DO 20 IMON = MONCUR+1, 12 BASETIME(LUNIT-30) = BASETIME(LUNIT-30) + DELTIM(IMON) 20 CONTINUE DO 30 IMON = 1, MONNEW BASETIME(LUNIT-30) = BASETIME(LUNIT-30) + DELTIM(IMON) 30 CONTINUE END IF BASETIME(LUNIT-30) = BASETIME(LUNIT-30) + 1 FLOAT(IDAY-1)*24.0*60.0*60.0 C C OPEN FILE C IBLANK = INDEX(LINE(ISTART+1:80), ' ') + ISTART LINE(IBLANK:IBLANK) = '.' OPEN (FILE=LINE(1:IBLANK+3),STATUS='OLD',UNIT = LUNIT-5) LINE = ' ' C C DETERMINE ON CAMPUS SITES AND FILE TYPES C DO 40 ISUB = 1, 1000 ISITES(LUNIT-30, ISUB) = 1 40 CONTINUE C DO 50 ISUB = 1,3 ITYPES(LUNIT-30,ISUB) = 0 50 CONTINUE C DO WHILE (INDEX(LINE,'COMP 0') .EQ.0) READ(LUNIT-5, FMT='(A80)') LINE END DO C READ(LUNIT-5, FMT='(A80)') LINE DO WHILE (INDEX(LINE,'COMP 1') .EQ.0) IF (INDEX(LINE,'_vt_').NE.0) THEN IEND = INDEX(LINE,' =') - 1 READ(LINE(1:IEND), FMT="(I20)") ISUB ISITES(LUNIT-30,ISUB) = 2 END IF READ(LUNIT-5, FMT='(A80)') LINE END DO C DO WHILE (INDEX(LINE,'COMP 3') .EQ.0) READ(LUNIT-5, FMT='(A80)') LINE END DO C READ(LUNIT-5, FMT='(A80)') LINE DO WHILE (INDEX(LINE,'COMP 4') .EQ.0) IF (INDEX(LINE,'txt' ).NE.0) ISUB2X = 1 IF (INDEX(LINE,'faq' ).NE.0) ISUB2X = 2 IF (INDEX(LINE,'html').NE.0) ISUB2X = 3 IF (INDEX(LINE,'= ;' ).NE.0) ISUB2X = 4 IF (INDEX(LINE,'sgml').NE.0) ISUB2X = 5 IF (INDEX(LINE,'ps' ).NE.0) ISUB2X = 6 IF (INDEX(LINE,'wri' ).NE.0) ISUB2X = 7 IF (INDEX(LINE,'tex' ).NE.0) ISUB2X = 8 IF (INDEX(LINE,'eps' ).NE.0) ISUB2X = 9 IF (INDEX(LINE,'dvi' ).NE.0) ISUB2X = 10 IF (INDEX(LINE,'pdf' ).NE.0) ISUB2X = 11 IF (INDEX(LINE,'doc' ).NE.0) ISUB2X = 12 IF (INDEX(LINE,'au' ).NE.0) ISUB2X = 13 IF (INDEX(LINE,'snd' ).NE.0) ISUB2X = 14 IF (INDEX(LINE,'mod' ).NE.0) ISUB2X = 15 IF (INDEX(LINE,'mid' ).NE.0) ISUB2X = 16 IF (INDEX(LINE,'way' ).NE.0) ISUB2X = 17 IF (INDEX(LINE,'gif' ).NE.0) ISUB2X = 18 IF (INDEX(LINE,'xbm' ).NE.0) ISUB2X = 19 IF (INDEX(LINE,'tif' ).NE.0) ISUB2X = 20 IF (INDEX(LINE,'tiff').NE.0) ISUB2X = 21 IF (INDEX(LINE,'jpg' ).NE.0) ISUB2X = 22 IF (INDEX(LINE,'jpeg').NE.0) ISUB2X = 23 IF (INDEX(LINE,'iff' ).NE.0) ISUB2X = 24 IF (INDEX(LINE,'mpeg').NE.0) ISUB2X = 25 IF (INDEX(LINE,'mov' ).NE.0) ISUB2X = 26 IF (INDEX(LINE,'mpg' ).NE.0) ISUB2X = 27 IF (INDEX(LINE,'avi' ).NE.0) ISUB2X = 28 IF (INDEX(LINE,'qt' ).NE.0) ISUB2X = 29 C IEND = INDEX(LINE,' =') - 1 READ(LINE(1:IEND), FMT="(I20)") ISUB ITYPES(LUNIT-30,ISUB2X) = ISUB C READ(LUNIT-5, FMT='(A80)') LINE END DO C DO WHILE (LINE(1:6).NE.'TRACE:') READ(LUNIT-5, FMT='(A80)') LINE END DO ENDIF C RETURN END C SUBROUTINE FINDMIN (IFILEMIN, TIMEMIN) C $INCLUDE:"PARAM.INC" $INCLUDE:"SCOM1.COM" $INCLUDE:"UCOM.FOR" C C ROUTINE TO FIND THE MINIMUM TIME FROM A SET OF TRACE RECORDS C C FIND THE MINIMUM TIME AND USE THAT RECORD C TIMEMIN = 9999999000.0 IFILEMIN = 0 DO 10 IFILE=1,5 IF(FILES(IFILE).NE.'NONE' .AND. 1 CURTIME(IFILE).NE.-1.0) THEN IF (CURTIME(IFILE).LT.TIMEMIN) THEN TIMEMIN = CURTIME(IFILE) IFILEMIN = IFILE ENDIF ENDIF 10 CONTINUE C RETURN END C FUNCTION NUM_MONTH (MONTH) C C ** ROUTINE TO RETURN THE SEQUENCE NUMBER OF THE MONTH C ** IN THE FIRST THREE CHARACTERS OF MONTH C CHARACTER*3 MONTH C IF (MONTH.EQ.'JAN') NUM_MONTH = 1 IF (MONTH.EQ.'FEB') NUM_MONTH = 2 IF (MONTH.EQ.'MAR') NUM_MONTH = 3 IF (MONTH.EQ.'APR') NUM_MONTH = 4 IF (MONTH.EQ.'MAY') NUM_MONTH = 5 IF (MONTH.EQ.'JUN') NUM_MONTH = 6 IF (MONTH.EQ.'JUL') NUM_MONTH = 7 IF (MONTH.EQ.'AUG') NUM_MONTH = 8 IF (MONTH.EQ.'SEP') NUM_MONTH = 9 IF (MONTH.EQ.'OCT') NUM_MONTH = 10 IF (MONTH.EQ.'NOV') NUM_MONTH = 11 IF (MONTH.EQ.'DEC') NUM_MONTH = 12 C RETURN END C SUBROUTINE WS_ERROR (ICODE, LEVEL) C C ** ROUTINE TO PROCESS AN ERROR C C ** INPUTS C ICODE = ERROR CODE NUMBER C LEVEL = F FOR FATAL OR W FOR WARNING C CHARACTER * 1 LEVEL, DUMMY CHARACTER * 5 CCODE CHARACTER * 80 LINE C C ** SET UP CODE C CCODE(1:1) = '#' WRITE(CCODE(2:5),FMT='(I4)') ICODE WRITE(*,*) CCODE C C ** OPEN ERROR FILE C OPEN (UNIT=39, FILE="ERROR.TXT", STATUS="OLD") C C ** FIND ERROR MESSAGE BASED ON CODE C READ(39,FMT="(A80)") LINE DO WHILE (LINE(1:5).NE.CCODE .AND. LINE(1:5).NE.'# END') READ(39,FMT="(A80)") LINE END DO C C ** WRITE ERROR MESSAGE C WRITE (*,*) 'ERROR NUMBER ', ICODE, ' HAS OCCURRED' IF (LINE(1:5).NE.'# END') THEN READ(39,FMT="(A80)") LINE DO WHILE (LINE(1:1).NE.'#') WRITE(*,*) LINE READ(39,FMT="(A80)") LINE END DO C ELSE WRITE(*,*) 'ERROR MESSAGE NOT FOUND' ENDIF C C ** HOLD UNTIL USER RESPONDS C IF (LEVEL.EQ.'F') THEN WRITE (*,*) 'FATAL ERROR. TERMINATING RUN.' ENDIF WRITE (*,*) 'ENTER ANY CHARACTER TO CONTINUE' READ (*,FMT="(A1)") DUMMY C C ** CLOSE ERROR FILE. IF FATAL ERROR STOP RUN C CLOSE(39) IF (LEVEL.EQ.'F') THEN STOP ENDIF C RETURN END C SUBROUTINE MEASURE (VALUE, ICOLCT, IDCACHE) C C ROUTINE TO OBSERVE A PERFORMANCE MEASURE VALUE C C INPUTS: C VALUE = P.M. VALUE OBSERVED C ICOLCT = P.M. COLLECT ID C IDCACHE = CACHE ID C ISTAT = (IDCACHE-1)*15 + ICOLCT CALL COLCT (VALUE, ISTAT) C RETURN END C SUBROUTINE UP_SIZE (DELSIZE, IDCACHE) C C ROUTINE TO UPDATE THE SIZE OF A CACHE C C INPUTS: C DELSIZE = CHANGE IN NUMBER OF BYTES IN CACHE C IDCACHE = CACHE ID C $INCLUDE:"PARAM.INC" $INCLUDE:"SCOM1.COM" C IBASE = (IDCACHE-1) * 3 XX(IBASE+1) = XX(IBASE+1) + DELSIZE XX(IBASE+2) = XX(IBASE+1) / 1024.0 XX(IBASE+3) = NUM_FILE(IDCACHE) C RETURN END C FUNCTION PMAVG (ICOLCT, IDCACHE) C C ROUTINE TO RETURN A PERFORMANCE MEASURE AVERAGE C C INPUTS: C ICOLCT = P.M. COLLECT ID C IDCACHE = CACHE ID C ISTAT = (IDCACHE-1)*15 + ICOLCT PMAVG = CCAVG(ISTAT) C RETURN END C FUNCTION PMNUM (ICOLCT, IDCACHE) C C ROUTINE TO RETURN THE NUMBER OF OBSERVATIONS OF A PERFORMANCE MEASURE C C INPUTS: C ICOLCT = P.M. COLLECT ID C IDCACHE = CACHE ID C ISTAT = (IDCACHE-1)*15 + ICOLCT PMNUM = CCNUM(ISTAT) C RETURN END C FUNCTION IS_TYPE(ITYPE, IFILE) C C ROUTINE TO DETERMINE IF A FILE IS OF A TYPE TO BE CACHED C $INCLUDE:"UCOM.FOR" C C INPUTS C ITYPE = TYPE OF FILE IN CODE OF INPUT FILE C IFILE = INPUT FILE C IS_TYPE = 1 C IF (ITYPE.EQ.ITYPES(IFILE,1) .OR. ITYPE.EQ.ITYPES(IFILE,2)) THEN IF (IBITMAP(1).EQ.1) IS_TYPE = 2 C ELSE IF (ITYPE.EQ.ITYPES(IFILE,3) .OR. ITYPE.EQ.ITYPES(IFILE,4)) THEN IF (IBITMAP(2).EQ.1) IS_TYPE = 2 C ELSE IF (ITYPE.EQ.ITYPES(IFILE,5) .OR. ITYPE.EQ.ITYPES(IFILE,6) .OR. 1 ITYPE.EQ.ITYPES(IFILE,7) .OR. ITYPE.EQ.ITYPES(IFILE,8) .OR. 2 ITYPE.EQ.ITYPES(IFILE,9) .OR. ITYPE.EQ.ITYPES(IFILE,10).OR. 3 ITYPE.EQ.ITYPES(IFILE,11).OR. ITYPE.EQ.ITYPES(IFILE,12)) THEN IF (IBITMAP(3).EQ.1) IS_TYPE = 2 C ELSE IF (ITYPE.EQ.ITYPES(IFILE,13) .OR. ITYPE.EQ.ITYPES(IFILE,14) .OR. 1 ITYPE.EQ.ITYPES(IFILE,15) .OR. ITYPE.EQ.ITYPES(IFILE,16) .OR. 2 ITYPE.EQ.ITYPES(IFILE,17)) THEN IF (IBITMAP(4).EQ.1) IS_TYPE = 2 C ELSE IF (ITYPE.EQ.ITYPES(IFILE,18) .OR. ITYPE.EQ.ITYPES(IFILE,19)) THEN IF (IBITMAP(5).EQ.1) IS_TYPE = 2 C ELSE IF (ITYPE.EQ.ITYPES(IFILE,20) .OR. ITYPE.EQ.ITYPES(IFILE,21) .OR. 1 ITYPE.EQ.ITYPES(IFILE,22) .OR. ITYPE.EQ.ITYPES(IFILE,23) .OR. 2 ITYPE.EQ.ITYPES(IFILE,24)) THEN IF (IBITMAP(6).EQ.1) IS_TYPE = 2 C ELSE IF (ITYPE.EQ.ITYPES(IFILE,25) .OR. ITYPE.EQ.ITYPES(IFILE,26) .OR. 1 ITYPE.EQ.ITYPES(IFILE,27) .OR. ITYPE.EQ.ITYPES(IFILE,28) .OR. 2 ITYPE.EQ.ITYPES(IFILE,29)) THEN IF (IBITMAP(9).EQ.1) IS_TYPE = 2 C ELSE IF (IBITMAP(10).EQ.1) IS_TYPE = 2 ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF C RETURN END