C CONTINUOUS SYSTEM MODELING PROGRAM C C CSMP MAIN PROGRAM C C CARNEGIE-MELLON UNIVERSITY C HYBRID COMPUTATION LABORATORY C JANUARY, 1969 C C REVISED VERSION FOR THE PDP-10 C WILLIAM CORWIN WORKING FOR C C. GORDON BELL C JANUARY 1971 C C VERSION FOR THE PDP11 UNDER RSTS C AND THE "FOR" COMPILER BY: C "DAVE" ESTES C WARNER AND SWASEY C C VERSION FOR IAS/RSX USING THE C "F4P" COMPILER BY: C MIKE DEARING C INTERNATIONAL HARVESTER CO. C SEPTEMBER 1977 C C C INTEGER DELAY,ORDER INTEGER SEMI,BLANK,PNUM,STOPS,PRINT,TEST9, 1COMMAN(16),IFILNA(16),OFILNA(16),PFILNA(16),CMD,ONUM, 2TEST1,TEST2,TEST3,TEST4,TEST5,TEST7,TEST8,INPUT(80),FILS(16) C C COMMON /ODEVIM/ONUM COMMON /PDEVIM/PNUM COMMON /NOSTOP/ITHROU COMMON/FLAGS/KEY7,TEST1,TEST2,TEST3,TEST4,TEST5,TEST7,TEST8,TEST9 COMMON/COUNTS/NLIST,NCON,NEQ,NOD,DELAY(25),NOFG(3),NFG COMMON/DATA/DT,DTS2,TTOT,F(3,11),TSAMP,IR COMMON/INTGS/INTG(25),DYDT(25) COMMON/NUMS/ORDER(201),MTRX(200,5),PAR(200,3),C(201) COMMON/PRNT/NK,PRINT(20),IDUM(3) COMMON/NOPRNT/NOPRNT COMMON/EXTRA2/TY(30) COMMON /TIMER/ALLSEC,IMINS,ISECS C DATA COMMAN/'HE','LO','CO','PA','FU','PU', . 'IN','OU','GO','FI','RE','EX', . 'TI','PR','PL','RU'/ C DATA PNUM/5/,ONUM/5/,IFILNA/'SY',':M','OD','EL','.D','AT',10*0 1/,OFILNA/'TI',':',13*' ',0/,PFILNA/'SY',':M', 2 'OD','EL','.D','AT',10*0/ DATA BLANK/1H /,SEMI/1H;/,IY/'Y'/ C C C TIME INITIALIZATION SUBROUTINE C CALL TIMES(A,J,K,0) C C ASSIGN OUTPUT AND INPUT TERMINAL ("TI:" PER RSX CONVENTION) C CALL ASSIGN(5,'TI:') C CALL ASSIGN(5,'TT:') C C THIS IS THE NORMAL ENTRY- IT ZEROS EVERYTHING C CSM0 IS TH INITIALIZATION SUBROUTINE THAT ZEROS EVERYTING C C 1 CALL CSM0 TEST2=5 IF(IRESTA.EQ.1)TEST2=IOLD IRESTA=0 STOPS=1 NOPRNT=0 WRITE(5,3) 3 FORMAT(' LIMIT KEYBOARD OUTPUT?',$) READ(5,21)I IF(I.EQ.IY)NOPRNT=1 WRITE (5,2) 2 FORMAT (' FOR HELP TYPE "HELP"'/) C C TEST5 CONTAINS A VALUE DEPENDING ON THE RETURN C SOME ARE ERROR RETURNS C 10 GO TO (20,20,20,30,50,50)TEST5 30 WRITE (5,31) GO TO 20 31 FORMAT (/20H ERROR IN PROCESSING/) 50 WRITE (5,51) GO TO 20 51 FORMAT (/33H RUN TERMINATED BY A QUIT ELEMENT/) C C HERE WE COME BACK TO THE SAME OLD POINT C IT IS TIME TO GET MORE COMMANDS C 20 TEST5=1 WRITE (5,22) 22 FORMAT (2H *$) DO 23 J=1,80 23 INPUT(J)=0 READ (5,21,END=230)INPUT 21 FORMAT (80A1) I=1 C C NOW TO SEPARATE THE COMMAND OUT OF THE INPUT C 60 ENCODE(6,65,CMD)(INPUT(J),J=I,I+2) 65 FORMAT(3A1,1X) DO 70 J=1,17 C C IS IT A VALID COMMAND, ASK THE ARRAY 'COMMAN' C AND THEN JUMP OUT OF THIS LOOP C IF (CMD.EQ.COMMAN(J))GO TO (120,130,140,150,160,170,180, 1190,200,210,220,230,240,250,260,270)J 70 CONTINUE GO TO 1100 C C CAN'T FIND THE COMMAND - MUST BE AN ERROR C C NOW TO EXECUTE THE COMMANDS C 120 CALL CSM12 C C THIS COMMAND WAS THE "HELP" COMMAND, SO CALL THE SUBROUTINE C WITH ALL THE HELP C GO TO 1000 130 TEST2=5 C C NOW WE WANT TO LOOK AT THE BLOCK OUTPUTS C FIRST SET TEST2 (THE INPUT DEVICE NUMBER) EQUAL TO 5(TTY) C THEN CALL THE INTERROGATION ROUTINE C CALL CSM13 GO TO 1000 140 TEST1=2 C C CONFIGURATION- SO YOU WANT TO SET UP A MODEL C FIRST SET THE ERROR INDICATOR TO 2 SO WE CAN SEE AN ERROR C C SET UP THE INPUT FILE C C IF(TEST2.NE.5)CALL ASSIGN(TEST2,IFILNA,0,'RDO') C THEN GO TO THE INPUT SECTION C CALL CSM1 C C NOW THE PRESORT SECTION C CALL CSM2 C C BUT WAS THERE AN ERROR? C IF (TEST1.NE.1)GO TO 141 143 WRITE (5,142) C C THERE MUST HAVE BEEN, SO TELL HIM AND SEE IF HE HAS SOME C BRIGHT IDEAS C BUT DON'T LET HIM GET PAST THIS POINT C STOPS=1 GO TO 1000 142 FORMAT (/27H CONFIGURATION NOT COMPLETE/) 141 CALL CSM3 C C NO ERROR SO SORT THE MODEL AND TEST AGAIN C IF (TEST1.EQ.1) GO TO 143 STOPS=0 GO TO 1000 150 IF (STOPS.GT.0) GO TO 143 C C DON'T LET HIM IN IF HE ISN'T DONE C HE'S IN? OK, GET THE PARAMETERS C CALL CSM4 STOPS=-1 IF (TEST4.EQ.1) GO TO 163 GO TO 1000 160 IF (STOPS.EQ.1)GO TO 143 IF(STOPS.LE.-1)GO TO 161 C C HELP HIM FIND HIS ERROR, BUT LET HIM THROUGH (161) IF IT'S C ALL RIGHT C WRITE (5,162) GO TO 1000 162 FORMAT(24H PARAMETERS NOT COMPLETE) 161 IF (TEST4.EQ.1) GO TO 163 C C TEST4 TELLS IF THERE ARE ANY FUNCTIONS IN THE MODEL C IF THERE ARE LET HIM SPECIFY THEM C CALL CSM5 163 WRITE (5,164) IF(TEST2.NE.5) CLOSE (UNIT=TEST2) C C THE MODEL IS NOW ALL SET UP- ON THE OUTPUT PARAMETERS, C WHICH ARE CHANGABLE C TEST2=5 TEST3=2 STOPS=-2 GO TO 1000 164 FORMAT (15H MODEL COMPLETE) 170 IF(STOPS.GE.-1) GO TO 171 IF (TEST3.NE.2) GO TO 171 C C SO YOU WANT TO OUTPUT THE MODEL, FIRST CHECK TO SEE IF C YOU ARE DONE TO THIS STAGE, YOU ARE? OK CALL CSM6 TO DO C THE ACTUALL OUTPUTING OF THE MODEL C C SET UP PUNCH OUTPUT FILE C IF(PNUM.NE.5)CALL ASSIGN(PNUM,PFILNA,0,'NEW','CC') C CALL CSM6 ENDFILE PNUM CLOSE (UNIT=PNUM) GO TO 1000 171 WRITE (5,172) GO TO 1000 172 FORMAT (19H MODEL NOT COMPLETE) 180 IF(STOPS.LE.-2)GO TO 181 IF(TEST3.NE.2) GO TO 171 C C NOW TO SPECIFY THE INTEGRATION PARAMETERS C 181 CALL CSM7 STOPS=-3 GO TO 1000 190 IF (STOPS.GT.-3) GO TO 171 C C SPECIFY THE OUTPUT PARAMETERS TO MAKE IT PRETTY C CALL CSM8A STOPS=-4 GO TO 1000 191 WRITE (5,192) GO TO 1000 192 FORMAT (34H INTEGRATION SPECIFICATIONS NEEDED) 200 IF (STOPS.NE.-4) GO TO 201 ITHROU=1 C C NOW FOR THE DIRTY WORK. CSM8A, BESIDES GETTING THE OUTPUT C PARAMETERS ALSO PRINTS THE HEADING. THIS CAN CAUSE PROBLEMS C SO USE A VARIBLE TO LET YOU DO ONE OR THE OTHER BUT NOT C BOTH, THIS VARIABLE IS ITHROU. C C BUT DON'T WANT TO SET UP THE SAME OLD FILE IF IT HAS ALREADY C INITIALIZED C CALL CSM8A ITHROU=0 C C RESET ITHROU AND THEN GO ON TO EXECUTE THE MODEL C CALL CSM10 GO TO 1000 201 WRITE (5,202) GO TO 1000 202 FORMAT (16H MORE WORK TO DO) C C NOW TO MAKE USE OF THE PDP-10'S MANY DEVICES C FIRST PRINT OUT THE OLD DEVICE NAME C THE FILE NAME CAN ONLY BE FIVE CHARACTERS IN LENGTH C WITH NO EXTENSION- THANKS TO IFILE AND OFILE C 210 WRITE (5,211)IFILNA C C FIRST DO THE INPUT DEVICE C 211 FORMAT (' OLD INPUT FILE WAS ',16A2,' REPLACE WITH') 212 FORMAT (16A2) READ (5,212)FILS CALL GETNAM(FILS,IFILNA,TEST2,3) C 214 WRITE (5,213)OFILNA 213 FORMAT (' OLD OUTPUT FILE WAS ',16A2,' REPLACE WITH') C READ (5,212)FILS CALL GETNAM(FILS,OFILNA,ONUM,1) C C DO THE SAME FOR THE OUTPUT FILES C WRITE(5,215)PFILNA 215 FORMAT (' OLD MODEL OUTPUT FILE WAS ',16A2,' REPLACE WITH') C READ (5,212)FILS CALL GETNAM(FILS,PFILNA,PNUM,2) C C AND LAST BUT NOT LEAST FOR THE PUNCH OR MODEL OUTPUT FILE C GO TO 1000 220 WRITE (5,221) C C THIS PART OF THE PROGRAM DOES A 'RESTART' C IT CALLS TIME TO FIND, AND RESET THE TIMES C IT THEN JUMPS OFF TO THE START OF THE PROGRAM TO C ZERO OUT EVERYTHING C CALL TIMES(A,J,K,2) WRITE (5,232)A WRITE (5,233)J,K IRESTA=1 IOLD=TEST2 CLOSE (UNIT=ONUM) CLOSE (UNIT=PNUM) GO TO 1 221 FORMAT (/' RESTART IN PROGRESS'/) 230 WRITE (5,231) C C THIS IS THE PART THAT CAUSES AN EXIT FROM THE PROGRAM C IF FOR SOME REASON YOU WANT TO STOP AND DON'T WANT TO HIT C CONTROL C (SO WHAT IF ALL YOU FILES MIGHT NOT BE SAFE UNDER C A CONTROL C, IT'S FASTER) C 231 FORMAT (//' END OF RUN') CALL TIMES(A,J,K,1) C C OUTPUT THE TIMES C WRITE (5,232)A 232 FORMAT (' TOTAL CPU TIME FOR RUN ',F15.3,' SECONDS') WRITE (5,233)J,K C C NOW LEAVE THE PROGRAM TO SEE FORTANS EXIT TIMES C C STOP CALL EXIT 233 FORMAT (' ELAPSED TIME 'I4,' MIN ',I2,' SECONDS') C C NOW TO FIND OUT WHAT TIME IT IS AND TO RESET THE TIME C 240 CALL TIMES(A,J,K,2) WRITE (5,232)A WRITE (5,233)J,K GO TO 1000 C C THE NEXT TWO TELL WHETHER YOU WANT PRINTED OR PLOTED OUTPUT C 250 KEY7=1 C C OK, MAKE IT A PRINT JOB C IF(STOPS.LT.-3)STOPS=-3 C C OK, CHANGE THE WAY IT'S OUTPUT AND BETTER GET THE NEEDED C INFORMATION C GO TO 1000 260 KEY7=2 C C OK, MAKE IT A PLOT JOB C IF(STOPS.LT.-3)STOPS=-3 GO TO 1000 C C THIS IS FOR THE RUN COMMAND C IT IS MAINLY TO SAVE TYPING FINGERS C 270 GO TO (271,272,273,274,275,276)STOPS+5 C C FIRST DECIDE WHERE THE USER IS AND PICK UP WHERE HE LEFT OFF C GO TO 1100 C276 IF(TEST2.NE.5)CALL ASSIGN(TEST2,IFILNA) C 276 CALL CSM1 CALL CSM2 IF (TEST1.NE.1)GO TO 2761 2762 WRITE (5,142) GO TO 276 2761 CALL CSM3 IF(TEST1.EQ.1)GO TO 2762 STOPS=0 275 CALL CSM4 STOPS=-1 IF(TEST4.EQ.1) GO TO 2741 274 CALL CSM5 2741 WRITE(5,164) TEST2=5 TEST3=2 STOPS=-2 273 IF (TEST7.EQ.2) GO TO 272 CALL CSM7 STOPS=-3 272 IF(TEST8.EQ.2) GO TO 271 CALL CSM8A STOPS=-4 C C THE TESTS OF TEST7 AND 8 WERE TO DETERMINE IF THEY HAVE C ALREADY BEEN ENTERED AND SO DON'T ASK FOR THEM AGAIN C 271 STOPS=-4 ITHROU=1 CALL CSM8A ITHROU=0 CALL CSM10 GO TO 1000 C C THIS IS WHERE EVERYTHING ENDS UP C 1000 DO 1001 J=I+3,80 C C IF THE INPUT HAS A SCMICOLON IN IT BE PREPARED FOR ANOTHER C COMMAND C IF (INPUT(J).EQ.SEMI) GO TO 1010 C C IF THE INPUT IS ZERO THEN EXIT, ELSE LOOP C 1001 IF (INPUT(J).EQ.0) GO TO 10 GO TO 10 1010 IF((INPUT(J+1).EQ.0).OR.(INPUT(J+1).EQ.BLANK))GO TO 10 I=J+1 IF(TEST5.GT.3) GO TO 10 GO TO 60 C C IF THERE WAS AN ERROR COME HERE C HOWEVER, LET THE USER HAVE A BLANK COMMAND C 1100 IF(CMD.EQ.BLANK)GO TO 20 WRITE (5,1101) GO TO 20 1101 FORMAT (' COMMAND ERROR- FOR HELP TYPE "HELP"') END BLOCK DATA COMMON/EXTRA2/TY(30) DATA TY(1)/1HA/ DATA TY(2)/1HB/ DATA TY(3)/1HC/ DATA TY(4)/1HD/ DATA TY(5)/1HE/ DATA TY(6)/1HF/ DATA TY(7)/1HG/ DATA TY(8)/1HH/ DATA TY(9)/1HI/ DATA TY(10)/1HJ/ DATA TY(11)/1HK/ DATA TY(12)/1HL/ DATA TY(13)/1HM/ DATA TY(14)/1HN/ DATA TY(15)/1HO/ DATA TY(16)/1HP/ DATA TY(17)/1HQ/ DATA TY(18)/1HR/ DATA TY(19)/1HS/ DATA TY(20)/1HT/ DATA TY(21)/1HU/ DATA TY(22)/1HV/ DATA TY(23)/1HW/ DATA TY(24)/1HX/ DATA TY(25)/1HY/ DATA TY(26)/1HZ/ DATA TY(27)/1H+/ DATA TY(28)/1H-/ DATA TY(29)/1H// DATA TY(30)/1H / END