PROGRAM CONSIST C------------------------------------------------------------ C COMPUTATION OF CONSISTENT MEASURING SYSTEM AT LEAST COST. C PROGRAMMED FOR CE 102 BY R. S. MILLS. C C VERSION 3.1.2 10/01/94 (DOS VERSION, W/ ERROR CORRECTION) C------------------------------------------------------------ C NOTATION: C PREQD : REQUIRED SYSTEM PRECISION INDEX C PREC : CALCULATED PRECISION INDEX FOR TRIAL SYSTEM C COST : COST OF TRIAL SYSTEM C N : NUMBER OF SYSTEM PARAMETERS C S( ) : PARAMETER SENSITIVITY C ND( ) : NUMBER OF DEVICES FOR EACH PARAMETER C DP( , ) : DEVICE PRECISION INDEX C C( , ) : DEVICE COST PER USE C JN( ) : DEVICE NUMBERS FOR CURRENT TRIAL SYSTEM C------------------------------------------------------------ DIMENSION S(10),DP(10,5),C(10,5),ND(10),JN(10) CHARACTER*1 ICOM CHARACTER*1 ANS C-------------- C SAY HELLO. C-------------- WRITE(*,100) 100 FORMAT(22(/),' Computation of Consistent Measuring System ', +'at Least Cost.') C----------------------------------------------- C INPUT MAXIMUM PERMISSABLE PRECISION INDEX. C----------------------------------------------- 1000 WRITE(*,*) WRITE(*,110) 110 FORMAT(' Required system precision index? '\) READ(*,*,err=111) PREQD C----------------------------- C INPUT NUMBER OF PARAMETERS. C----------------------------- 111 WRITE(*,*) WRITE(*,120) 120 FORMAT(' Number of parameters? '\) READ(*,*,err=121) N C----------------------------------------------------------------- C INPUT SENSITIVITY AND NUMBER OF DEVICES FOR EACH PARAMETER. C----------------------------------------------------------------- 121 DO 10 I=1,N WRITE(*,200) I 200 FORMAT(' Parameter',I2,' sensitivity (S)? '\) READ(*,*,err=201) S(I) 201 WRITE(*,300) I 300 FORMAT(' Number of devices for parameter',I2,'? '\) READ(*,*,err=301) ND(I) C-------------------------------------------------- C INPUT PRECISION INDEX AND COST FOR EACH DEVICE. C-------------------------------------------------- 301 DO 10 J=1,ND(I) WRITE(*,400) J 400 FORMAT(' Device',I2,' precision and cost (dP, C)? '\) READ(*,*,err=10) DP(I,J),C(I,J) 10 CONTINUE C---------------------- C ECHO INPUT. C---------------------- WRITE(*,*) WRITE(*,*) 'Required system precision index, P = ',PREQD WRITE(*,500) 500 FORMAT(/' Parameter',2X,'Sensitivity',3X,'Device',3X, +'Precision',2X,'Cost') DO 20 I=1,N WRITE(*,600) I,S(I) 600 FORMAT(' ',I5,F16.1) DO 20 J=1,ND(I) 20 WRITE(*,700) J,DP(I,J),C(I,J) 700 FORMAT(' ',23X,I6,F13.6,F7.2) C-------------------------------- C CHECK FOR ERROR CORRECTION. C-------------------------------- WRITE(*,*) WRITE(*,710) 710 FORMAT(' Data satisfactory (Y,n)? '\) READ(*,1200,END=30) ICOM IF(ICOM.EQ.'N'.OR.ICOM.EQ.'n') THEN WRITE(*,*) WRITE(*,720) 720 FORMAT(' Error correction: Enter "c" ', +'to retain current value and continue.') GO TO 1000 ENDIF C--------------------- C SET UP FOR SEARCH. C--------------------- 30 P=PREQD**2 DO 40 I=1,N 40 JN(I)=1 CMIN=1.0E+20 NUM=0 C-------------------------------------------------------------- C BEGIN SEARCH, CHECK EVERY POSSIBLE COMBINATION FOR COST AND C PRECISION INDEX. OUTPUT EACH SEQUENTIAL BEST CHOICE. C-------------------------------------------------------------- 2000 COST=0. PREC=0. DO 50 I=1,N PREC=PREC+S(I)**2*DP(I,JN(I))**2 50 COST=COST+C(I,JN(I)) IF(COST.GT.CMIN.OR.PREC.GT.P) GO TO 60 NUM=NUM+1 CMIN=COST WRITE(*,800) (JN(I),I=1,N) 800 FORMAT(/' For devices = ',10I4) PREC=SQRT(PREC) IPREC=PREC WRITE(*,900) IPREC,COST 900 FORMAT(' Precision = ',I13,' at cost = $',F6.2) C-------------------------------------------------------------------- C THIS IS THE ALGORITHM TO PERFORM ALL PERMUTATIONS OF THE POSSIBLE C COMBINATIONS OF DEVICES. C-------------------------------------------------------------------- 60 JN(1)=JN(1)+1 DO 70 I=1,N-1 IF(JN(I).LE.ND(I)) GO TO 70 JN(I)=1 JN(I+1)=JN(I+1)+1 70 CONTINUE C--------------------------------------------------------------- C CHECK IF ALL POSSIBLE COMBINATIONS OF DEVICES ARE EXHAUSTED. C IF NOT, LOOP BACK FOR ANOTHER TRIAL. C--------------------------------------------------------------- IF(JN(N).LE.ND(N)) GO TO 2000 C------------------------------------- C CHECK FOR NO ACCEPTABLE SOLUTION. C------------------------------------- IF(NUM.LT.1) THEN WRITE(*,*) WRITE(*,*) ' *** Warning: No acceptable solution found.***' ENDIF C--------------------------- C DO RESTART IF DESIRED. C--------------------------- CLOSE(UNIT=6) WRITE(*,*) WRITE(*,1150) 1150 FORMAT(' Another analysis (y,N)? '\) READ(*,1200,END=99) ICOM 1200 FORMAT(A1) IF(ICOM.EQ.'Y'.OR.ICOM.EQ.'y') GO TO 1000 99 END