PROGRAM AGN C****************************************************************** C C ACCGEN program to calculate charging rates and write the C relevant output files needed for task building the C accounting system (version 7). C I apologise in advance for this program. C C S.M. THOMPSON, february 1980 C C REVISION HISTORY C ---------------- C C SMT717 15-jul-81 fix bug which caused errors in the output C file rates.cmd for certain values of the C input charges. C C SMT724 27-jul-81 added page charge request (cost per page C printed) C C SMT774 24-oct-81 added support for memory usage charges C C SMT775 24-Oct-81 Allowed for zero charges and only give the C "is this good enough" message if the actual C and desired charge differ by more than half C a percent. C C****************************************************************** C DIMENSION IBUF(8) INTEGER*4 IBEST,JBEST REAL MEM,MEMU,MEM1 BYTE CHAR EQUIVALENCE (ITICK,IBUF(8)) DATA UNIT /0.0001/ ! Internal to external unit conversion C CALL GTIM(IBUF) ! get clock frequency TICKU = 3600.0*FLOAT(ITICK)*UNIT C C open .cmd file (included at task build in acc v7) C OPEN(UNIT=2,NAME='RATES.CMD',TYPE='NEW',FORM= 1 'FORMATTED') C C ===== connect time rate C 10 WRITE(1,500) 500 FORMAT(/,' Enter connect time rate (per hr.): ',$) IBEST = 0 JBEST = 1 READ(1,*,END = 15,ERR = 10) CONN IF(CONN.EQ.0)GO TO 15 CALL RATE(CONN,TICKU,IBEST,JBEST,CONN1) IF(ABS(CONN1/CONN-1.0).LT.0.005)GO TO 15 WRITE(1,501) CONN1 501 FORMAT(/,' Nearest I can do is',F7.3,'/hr. Will this do?',$) READ(1,502) CHAR 502 FORMAT(A1) IF(CHAR.NE.'Y'.AND.CHAR.NE.'y')GO TO 10 15 CLOSE(UNIT = 1) CALL PUT('$CON1',IBEST) CALL PUT('$CON2',JBEST) C C ===== cpu rate C 20 WRITE(1,505) 505 FORMAT(/,' Enter CPU rate (per hr.): ',$) IBEST = 0 JBEST = 1 READ(1,*,END = 25,ERR = 20) CPU IF(CPU.EQ.0.0)GO TO 25 CALL RATE(CPU,TICKU,IBEST,JBEST,CPU1) IF(ABS(CPU1/CPU-1.0).LE.0.005)GO TO 25 WRITE(1,507) CPU1 507 FORMAT(/,' The closest I can make it is',F7.3,'/hr. Will this 1 DO? ',$) READ(1,502) CHAR IF(CHAR.NE.'Y'.AND.CHAR.NE.'y') GO TO 20 25 CLOSE(UNIT = 1) CALL PUT('$CPU1',IBEST) CALL PUT('$CPU2',JBEST) C C ===== i/o request rate C 30 WRITE(1,510) 510 FORMAT(/,' Enter rate per 1,000,000 I/O requests: ',$) IBEST = 0 JBEST = 1 READ(1,*,END = 35,ERR = 30) QIO IF(QIO.EQ.0.0)GO TO 35 CALL RATE(QIO,1.0E6*UNIT,IBEST,JBEST,QIO1) IF(ABS(QIO1/QIO-1.0).LT.0.005)GO TO 35 WRITE(1,511) QIO1 511 FORMAT(/,' Nearest I can do is',F7.3,' per M. Will this do?',$) READ(1,502) CHAR IF(CHAR.NE.'Y'.AND.CHAR.NE.'y')GO TO 30 35 CLOSE(UNIT = 1) CALL PUT('$QIO1',IBEST) CALL PUT('$QIO2',JBEST) C C ===== disk rate C 40 WRITE(1,515) 515 FORMAT(/,' Enter disk rate per Megabyte per week: ',$) IBEST = 0 JBEST = 1 READ(1,*,END = 45,ERR = 40) DISK IF(DISK.EQ.0.0)GO TO 45 DISKU = 7.0*24.0*60.0*2000.0*UNIT CALL RATE(DISK,DISKU,IBEST,JBEST,DISK1) IF(ABS(DISK1/DISK-1.0).LT.0.005)GO TO 45 WRITE(1,517) DISK1 517 FORMAT(/,' Nearest I can do is',F7.3,'. Will this do?',$) READ(1,502) CHAR IF(CHAR.NE.'Y'.AND.CHAR.NE.'y')GO TO 40 45 CLOSE(UNIT = 1) CALL PUT('$DSK1',IBEST) CALL PUT('$DSK2',JBEST) C C ===== page charge C 50 IPAG1=0 WRITE(1,520) 520 FORMAT(/,' Enter charge per printed page: ',$) READ(1,*,END = 55,ERR = 55) PAGE IF(PAGE.GE.0.0.AND.PAGE.LT.3.276)GO TO 54 WRITE(1,521) 521 FORMAT(' AGN -- Invalid response') GO TO 50 54 IBEST=INT(PAGE/UNIT) 55 CLOSE(UNIT = 1) CALL PUT('$PAG1',IBEST) CALL PUT('$PAG2',1) C C ===== Memory rate C 60 WRITE(1,525) 525 FORMAT(/,' Enter memory usage charge per KW-Hour: ',$) IBEST = 0 JBEST = 1 READ(1,*,END = 65,ERR = 60) MEM IF(MEM.EQ.0.0)GO TO 65 MEMU = 1024.0*3600.0/64.0*UNIT CALL RATE(MEM,MEMU,IBEST,JBEST,MEM1) IF(ABS(MEM1/MEM-1.0).LT.0.005)GO TO 65 WRITE(1,527) MEM1 527 FORMAT(/,' Nearest I can do is',F7.3,'. Will this do?',$) READ(1,502) CHAR IF(CHAR.NE.'Y'.AND.CHAR.NE.'y')GO TO 40 65 CLOSE(UNIT = 1) CALL PUT('$MEM1',IBEST) CALL PUT('$MEM2',JBEST) CLOSE(UNIT = 2) CALL EXIT END C C*************************************************************************** C SUBROUTINE PUT(STR,I) BYTE STR(5) C ALOG8(X) = ALOG(X)/ALOG(8.0) C J=I IF(I.EQ.0)J=1 NDIGIT = INT(ALOG8(FLOAT(J))+1.001) WRITE(2,10) STR,I 10 FORMAT(' GBLDEF = ',5A1,':',O) RETURN END C C************************************************************************** C SUBROUTINE RATE(DOLLAR,TICKU,IBEST,JBEST,BEST) INTEGER*4 IBEST,JBEST,I,J RATIO = DOLLAR/TICKU RATB = 1.0E6 DO 10 I = 75,1,-1 J = FLOAT(I)/RATIO+0.5 RAT = FLOAT(I)/FLOAT(J) IF(ABS(RAT-RATIO).GT.ABS(RATB-RATIO))GO TO 10 RATB = RAT IBEST = I JBEST = J 10 CONTINUE BEST = TICKU*FLOAT(IBEST)/FLOAT(JBEST) RETURN END