Trailing-Edge
-
PDP-10 Archives
-
decuslib20-05
-
decus/20-0137/linpro/linpro.for
There is 1 other file named linpro.for in the archive.  Click here to see a list.
00100	C	WESTERN MICHIGAN UNIVERSITY
   00200	C	LINPRO.F4 (FILENAME ON LIBRARY DECTAPE)
 00300	C	LINPRO, 2.13.1 (CALLING NAME SUBLST #)
  00400	C	LINEAR PROGRAMMING MANIPULATION PROGRAM
 00500	C	LINPRO.F4 WAS PROGRAMMED BY A. H. WRIGHT (MATH DEPT. WMU)
   00600	C	 MODIFIED BY R.R. BARR
   00700	C	LIBRARY DECTAPE PROGRAMS USED:  USAGE.MAC
    00800	C	INTERNAL SUBR. USED:  MATOUT, COND
 00900	C	ABOVE COMMENTS AND RIGHT ADJUSTED COMMENTS PUT IN BY WG
01000	C
 01100	C	THIS IS A INTERACTIVE TUTORIAL PROGRAM TO TEACH THE SIMPLEX METHOD
    01200	C	OF LINEAR PROGRAMMING.  IT WILL WORK WITH ANY METHOD OF
01300	C	LINEAR PROGRAMMING WHICH USES THE STANDARD SIMPLEX TABLEAU
  01400	C	AND STANDARD PIVOT OPERATIONS.  THE USER MUST CHOOSE THE PIVOT
   01500	C	ENTRY OF THE TABLEAU, AND THE PROGRAM WILL DO THE PIVOT COMPUTATIONS.
 01600	C
 01700	C	THE USER HAS THE CHOICE OF FOUR DIFFERENT TABLEAU FORMATS.
  01800	C	THE OBJECTIVE FUNCTION ROW MAY BE ON THE TOP OR BOTTOM OF
   01900	C	THE TABLEAU, AND THE CONSTANT COLUMN MAY BE ON THE RIGHT OR
 02000	C	ON THE LEFT.
   02100	C
 02200	C	IN ADDITION THE THE OPTIONS FOR PIVOTING AND FOR PRINTING
   02300	C	THE TABLEAU, THERE ARE A NUMBER OF EDITING OPTIONS.  A LIST
 02400	C	OF OPTIONS MAY BE OBTAINED BY TYPING HELP WHEN THE COMPUTER
 02500	C	ASKS FOR AN OPTION.
 02600	C
 02700	C *******************************************************************
   02800	C
 02900	C	REQUIRED SUBROUTINES:
    03000	C
 03100	C	MATOUT(INTERN.)	PRINTS TABLEAU
03200	C	COND(INTERN.)	DETERMINES COLUMNS OF THE TABLEAU WHICH CONTAIN
    03300	C				ONLY ZEROS, ONES, AND MINUS ONES
03400	C	USAGEB		APPLICATIONS ROUTINE(APLIB)
03500	C
 03600	C *******************************************************************
   03700	C
 03800	C	LOAD PROCEDURE: LOA LINPRO,USAGE
   03900	C
 04000	C *******************************************************************
   04100	C
 04200	C	LIST OF IMPORTANT VARIABLES:
  04300	C
 04400	C	J	IS ALWAYS USED AS A ROW INDEX
    04500	C	P	IS THE HIGHEST INDEX OF A ROW
    04600	C	P0	IS THE LOWEST INDEX OF A ROW
    04700	C	P00	IS THE INDEX OF THE OBJECTIVE FUNCTION ROW
    04800	C
 04900	C	I	IS ALWAYS USED AS A COLUMN INDEX
 05000	C	N	IS THE HIGHEST INDEX OF A COLUMN
 05100	C	N0	IS THE LOWEST INDEX OF A COLUMN
 05200	C	N00	IS THE INDEX OF THE CONSTANT COLUMN
 05300	C
 05400	C	T	STORES THE TABLEAU
05500	C	TOLD	SAVES THE TABLEAU FOR THE "RETURN" OPTION
    05600	C	TSAVE	SAVES THE TABLEAU FOR THE "SAVE" AND THE "RECALL" OPTIONS
  05700	C	
     05800	C	IND(J)	A LOGICAL VARIABLE WHICH IS TRUE IF COLUMN I
    05900	C			CONTAINS ONLY ZEROS, ONES, AND MINUS ONES.
 06000	C			OTHERWISE IT IS FALSE.
 06100	C
 06200	C
 06300		LOGICAL IND,INDSAVE,INDOLD,IP,IN
    06400		INTEGER P,POLD,PSAVE,P0,P00,P9
 06500		DIMENSION T(0/35,0/35),IND(0/35),TOLD(0/35,0/35),
  06600	     1	INDOLD(0/35),TSAVE(0/35,0/35),INDSAVE(0/35)
  06700		COMMON N0,P0,N00,P00
 06800	C *******************************************************************
   06900	C	
07000	C	THIS SECTION SETS UP THE TABLEAU FORMAT AND INPUTS THE TABLEAU
   07100	C
 07200	C *********************************************************************
 07300		WRITE(5,8)
 07400	8	FORMAT(' TABLEAU OPTIONS')
    07500	C	CALL USAGEB('LINPRO')
    07600	400	WRITE(5,401)
 07700	401	FORMAT(' OBJECTIVE FUNCTION (TOP OR BOTTOM)?'$)
 07800	499	READ(5,402)ANS,ANS1
    07900	402	FORMAT(2A5)
  08000		IF(ANS.EQ.3HTOP.OR.ANS.EQ.5H"TOP")GO TO 405
   08100		IF((ANS.EQ.5HBOTTO.AND.ANS1.EQ.1HM).OR.(ANS.EQ.5H"BOTT.AND.ANS1
   08200	     1	.EQ.3HOM"))GO TO 410
08300		WRITE(5,403)
    08400	403	FORMAT(' IF YOU WANT THE ROW FOR THE OBJECTIVE FUNCTION TO 
    08500	     1	 BE PRINTED ON THE'/' TOP OF THE TABLEAU, ANSWER "TOP".
08600	     2	IF YOU WANT THE ROW FOR THE OBJECTIVE'/' FUNCTION TO BE PRINTED
  08700	     3	AT THE BOTTOM OF THE TABLEAU, ANSWER "BOTTOM".')
  08800		GO TO 499
  08900	405	P0 = 0
  09000		P00 = 0
    09100		IP = .FALSE.
    09200		GO TO 450
  09300	410	P0 = 1
  09400		IP = .TRUE.
09500	450	WRITE(5,451)
 09600	451	FORMAT(' CONSTANT COLUMN (RIGHT OR LEFT)?'$)
    09700		READ(5,452)ANS,ANS1
  09800	452	FORMAT(2A5)
  09900		IF((ANS.EQ.5HRIGHT).OR.(ANS.EQ.5H"RIGH.AND.ANS1.EQ.2HT"))GO TO 460
10000		IF((ANS.EQ.4HLEFT).OR.(ANS.EQ.5H"LEFT))GO TO 455
   10100		WRITE(5,453)
    10200	453	FORMAT(' IF THE WANT THE COLUMN OF CONSTANTS IN THE TABLEAU
    10300	     1	TO BE PRINTED ON THE'/' LEFT SIDE OF THE TABLEAU, ANSWER
    10400	     2	 "LEFT".  IF YOU WANT THE COLUMN OF CONSTANTS TO '/' BE PRINTED
  10500	     3	 ON THE RIGHT SIDE OF THE TABLEAU, ANSWER "LEFT".')
    10600	455	NO = 0
  10700		NOO = 0
    10800		IN = .FALSE.
    10900		GO TO 1
    11000	460	N0 = 1
  11100		IN = .TRUE.
11200	1	IF(IP)GO TO 2
  11300		WRITE(5,5)
 11400	5	FORMAT(' INPUT THE NUMBER OF CONSTRAINTS?'$)
 11500		READ(5,6)P
 11600	6	FORMAT(I)
 11700		GO TO 15
   11800	2	WRITE(5,3)
11900	3	FORMAT(' INPUT THE NUMBER OF ROWS?'$)
   12000		READ(5,6)P
 12100		P00 = P
    12200	15	IF(IN)GO TO 22
12300		WRITE(5,16)
12400	16	FORMAT(' INPUT THE NUMBER OF VARIABLES?'$)
  12500		READ(5,6)N
 12600		GO TO 29
   12700	22	WRITE(5,17)
   12800	17	FORMAT(' INPUT THE NUMBER OF COLUMNS?'$)
    12900		READ(5,6)N
 13000		N00 = N
    13100	29	WRITE(5,10)
   13200	10	FORMAT(' INPUT TABLEAU'/)
    13300		DO 11 J = P0,P
  13400		WRITE(5,30)J
    13500	30	FORMAT('+ROW',I2,'?',$)
 13600	11	READ(5,21)(T(J,I),I = N0,N)
  13700	21	FORMAT(35F)
   13800	39	CALL COND(T,IND,P,N)
    13900	C *********************************************************************
 14000	C
 14100	C	THIS SECTION CHOSSES THE OPTION
    14200	C
 14300	C *********************************************************************
 14400	40	WRITE(5,41)
   14500	41	FORMAT(' OPTION?'$)
14600		READ(5,42)OPT
   14700	42	FORMAT(A5)
    14800		IF(OPT.EQ.'PIV  '.OR.OPT.EQ.'PIVOT')GO TO 49
  14900		IF(OPT.EQ.'STOP ')GO TO 1000
   15000		IF(OPT.EQ.'P'.OR.OPT.EQ.'PRINT')GO TO 300
15100		IF(OPT.EQ.'CROW ')GO TO 2000
   15200		IF(OPT.EQ.'CCOL ')GO TO 3000
   15300		IF(OPT.EQ.'DROW ')GO TO 5000
   15400		IF(OPT.EQ.'DCOL')GO TO 5500
    15500		IF(OPT.EQ.'PROW')GO TO 6000
    15600		IF(OPT.EQ.'PCOL')GO  TO 6500
   15700		IF(OPT.EQ.'AROW')GO TO 7000
    15800		IF(OPT.EQ.'ACOL')GO TO  7500
   15900		IF(OPT.EQ.'CENT')GO TO 3400
    16000		IF(OPT.EQ.'PENT')GO TO 3600
    16100		IF(OPT.EQ.'RETUR')GO TO 8000
   16200		IF(OPT.EQ.'SAVE')GO TO 8200
    16300		IF(OPT.EQ.'RECAL')GO TO 8400
   16400		IF(OPT.EQ.'HELP '.OR.OPT.EQ.'H    '.OR.OPT.EQ.'"HELP')GO TO 4000
  16500		WRITE(5,44)
16600	44	FORMAT(' TYPE "HELP" FOR A LIST OF OPTIONS')
16700		GO TO 40
   16800	C *********************************************************************
 16900	C
 17000	C	PIVOT OPTION SECTION
17100	C
 17200	C *********************************************************************
 17300	49	POLD = P
 17400		NOLD = N
   17500		DO 55 I = N0,N
       17600		INDOLD(I) = IND(I)
   17700		DO 55 J = P0,P
  17800	55	TOLD(J,I) = T(J,I)
 17900		WRITE(5,50)
18000	50	FORMAT(' INPUT THE PIVOT COLUMN?'$)
    18100		READ(5,60,ERR=8998)I0
18200	60	FORMAT(I)
18300		IF(I0.EQ.N00)GO TO 64
18400		IF(I0.GE.N0.AND.I0.LE.N)GO TO 65
    18500		WRITE(5,9001)
   18600		GO TO 40
   18700	64	WRITE(5,63)N00
18800	63	FORMAT(' ARE YOU SURE YOU WANT TO PIVOT IN COLUMN',I2 ,'?'$)
    18900		READ(5,62,ERR=8998)ANS
    19000	62	FORMAT(A5)
    19100		IF(ANS.EQ.'NO')GO TO 49
   19200	65	WRITE(5,70)
   19300	70	FORMAT('+DO YOU WANT RATIOS PRINTED (YES OR NO)?'$)
   19400		READ(5,80,ERR=8998)ANS
    19500	80	FORMAT(A3)
    19600		IF(ANS.EQ.2HNO)GO TO 100
  19700		IF(ANS.EQ.3HYES)GO TO 71
  19800		WRITE(5,72)
19900	72	FORMAT(' ANSWER YES OR NO'/)
 20000		GO TO 65
   20100	71	DO 90 J = 1,P
 20200		IF(J.EQ.P00)GO TO 90
 20300		IF(T(J,I0).NE.0.)GO TO 81
 20400		WRITE(5,82)
20500	82	FORMAT(' DIVISION BY ZERO')
  20600		GO TO 90
   20700	81	QUOT = T(J,N00)/T(J,I0)
 20800		WRITE(5,85)QUOT
 20900	85	FORMAT(1X,G9.3)
    21000	90	CONTINUE
 21100		WRITE(5,99)
21200	99	FORMAT()
 21300	100	WRITE(5,110)
 21400	110	FORMAT('+INPUT THE PIVOT ROW?'$)
 21500		READ(5,120,ERR=8998)J0
    21600	120	FORMAT(I)
    21700		IF(J0.EQ.P00)GO TO 128
    21800		IF(J0.GE.P0.AND.J0.LE.P)GO TO 129
   21900		WRITE(5,9000)
   22000		GO TO 40
   22100	128	WRITE(5,124)P00
   22200	124	FORMAT(' ARE YOU SURE YOU WANT TO PIVOT IN ROW',I2,'?'$)
  22300		READ(5,123,ERR=8998)ANS
   22400	123	FORMAT(A5)
   22500		IF(ANS.EQ.'NO')GO TO 100
  22600	129	DO 180 I = N0,N
   22700		IF(.NOT.IND(I))GO TO 180
  22800		IF(T(J0,I).EQ.-1.OR.T(J0,I).EQ.1)IND(I) = .FALSE.
  22900	180	CONTINUE
23000		IND(I0) = .TRUE.
23100		PIV = T(J0,I0)
  23200		IF(PIV.NE.0.)GO TO 349
    23300		WRITE(5,348)
    23400	348	FORMAT(' YOU CANNOT PIVOT AT A ZERO ENTRY IN THE TABLEAU')
     23500		GO TO 40
   23600	349	DO 350 I = N0,N
   23700	350	T(J0,I) = T(J0,I)/PIV
  23800		DO 200 J = P0,P
 23900		IF(J.EQ.J0)GO TO 200
 24000		E = T(J,I0)
24100		DO 190 I = N0,N
 24200	190	T(J,I) = T(J,I)-E*T(J0,I)
   24300	200	CONTINUE
24400		DO 210 J=P0,P
   24500		DO 210 I=N0,N
   24600		IF(ABS(T(J,I)).GE.2E-7)GO TO 201
    24700		T(J,I) = 0.
24800		GO TO 210
  24900	201	IF(ABS(T(J,I)-1.).GE.2E-7)GO TO 202
   25000		T(J,I) = 1.
25100		GO TO 210
  25200	202	IF(ABS(T(J,I)+1.).GE.2E-7)GO TO 210
   25300		T(J,I) = -1
25400	210	CONTINUE
25500		GO TO 40
   25600	C *********************************************************************
 25700	C
 25800	C	PRINT SECTION (PRINTS TABLEAU)
25900	C
 26000	C *********************************************************************
 26100	300	CALL MATOUT (T,IND,P,N)
26200		GO TO 40
   26300	C *********************************************************************
 26400	C
 26500	C	STOP OPTION SECTION
 26600	C
 26700	C *********************************************************************
 26800	1000	WRITE(5,1010)
    26900	1010	FORMAT(' DO YOU WANT TO DO ANOTHER PROBLEM?'$)
 27000		READ(5,1020,ERR=8998)ANS
  27100	1020	FORMAT(A5)
  27200		IF(ANS.EQ.'YES  ')GO TO 1
 27300		STOP
  27400	C *********************************************************************
 27500	C
 27600	C	CROW (CHANGE ROW) OPTION SECTION
   27700	C
 27800	C *********************************************************************
 27900	2000	WRITE(5,2010)
    28000	2010	FORMAT(' INPUT THE NUMBER OF THE ROW YOU WANT TO CHANGE?'$)
   28100		READ(5,2020,ERR=8998)J0
   28200	2020	FORMAT(I)
   28300		IF(J0.GE.P0.AND.J0.LE.P)GO TO 2021
  28400		WRITE(5,9000)
   28500		GO TO 40
   28600	2021	WRITE(5,2030)J0
  28700	2030	FORMAT(' INPUT ROW',I3,/' ?'$)
  28800		READ(5,2040,ERR=8998)(T(J0,I),I=N0,N)
    28900	2040	FORMAT(35F)
 29000		CALL COND(T,IND,P,N)
 29100		GO TO 40
   29200	C *********************************************************************
 29300	C
 29400	C	CCOL (CHANGE COLUMN) OPTION SECTION
29500	C
 29600	C *********************************************************************
 29700	3000	WRITE(5,3010)
    29800	3010	FORMAT(' INPUT THE NUMBER OF THE COLUMN YOU WANT TO CHANGE?'$)
29900		READ(5,3020,ERR=8998)I0
   30000	3020	FORMAT(I)
   30100		IF(I0.GE.N0.AND.I0.LE.N)GO TO 3021
  30200		WRITE(5,9001)
   30300		GO TO 40
   30400	3021	WRITE(5,3030)I0
  30500	3030	FORMAT(' INPUT COLUMN',I3,' (IN A ROW)'/' ?'$)
 30600		READ(5,3040,ERR=8998)(T(J,I0),J=P0,P)
    30700	3040	FORMAT(35F)
 30800		IF(N.GT.8)CALL COND(T,IND,P,N)
 30900		GO TO 40
   31000	C *********************************************************************
 31100	C
 31200	C	CENT (CHANGE ENTRY) OPTION SECTION
 31300	C
 31400	C *********************************************************************
 31500	3400	WRITE(5,3410)
    31600	3410	FORMAT(' INPUT THE ROW AND COLUMN INDICES OF THE ENTRY YOU',
  31700	     1	' WANT TO CHANGE?'$)
31800		READ(5,3420,ERR=8998)J0,I0
31900	3420	FORMAT(2I)
  32000		IF(J0.GE.P0.AND.J0.LE.P)GO TO 3425
  32100		WRITE(5,9000)
   32200		GO TO 40
   32300	3425	IF(I0.GE.N0.AND.I0.LE.N)GO TO 3429
   32400		WRITE(5,9001)
   32500		GO TO 40
   32600	3429	WRITE(5,3430)
    32700	3430	FORMAT(' INPUT THE NEW ENTRY?'$)
32800		READ(5,3440,ERR=8998)T(J0,I0)
  32900	3440	FORMAT(F)
   33000		GO TO 39
   33100	C *********************************************************************
 33200	C
 33300	C	PENT (PRINT ENTRY) OPTION SECTION
  33400	C
 33500	C *********************************************************************
 33600	3600	WRITE(5,3610)
    33700	3610	FORMAT(' INPUT THE ROW AND COLUMN INDICES OF THE ENTRY YOU',
  33800	     1	' WANT TO PRINT?'$)
 33900		READ(5,3620,ERR=8998)J0,I0
34000	3620	FORMAT(2I)
  34100		IF(J0.GE.P0.AND.J0.LE.P)GO TO 3625
  34200		WRITE(5,9000)
   34300		GO TO 40
   34400	3625	IF(I0.GE.N0.AND.I0.LE.N)GO TO 3629
   34500		WRITE(5,9001)
   34600		GO TO 40
   34700	3629	WRITE(5,3630)J0,I0,T(J0,I0)
34800	3630	FORMAT(' THE ENTRY IN ROW',I3,' AND COLUMN',I3,' IS',G15.7)
   34900		GO TO 40
   35000	C *********************************************************************
 35100	C
 35200	C	HELP (LIST OF OPTIONS) OPTION SECTION
   35300	C
 35400	C *********************************************************************
 35500	4000	WRITE(5,4010)
    35600	4010	FORMAT(' LIST OF OPTIONS:'/' PRINT',T25,'PRINTS TABLEAU'/
35700	     1  ' PIV',T25,'ALLOWS USER TO DO A PIVOT OPERATION'/
35800	     2  ' CROW',T25,'ALLOWS USER TO CHANGE A ROW OF THE TABLEAU'/
  35900	     3  ' CCOL',T25,'ALLOWS USER TO CHANGE A COLUMN'/
    36000	     4  ' DROW',T25,'ALLOWS USER TO DELETE A ROW OF THE TABLEAU'/
  36100	     5  ' DCOL',T25,'ALLOWS USER TO DELETE A COLUMN OF THE TABLEAU'/
    36200	     6  ' PROW',T25,'ALLOWS USER TO PRINT A ROW OF THE TABLEAU'/
   36300	     7  ' PCOL',T25,'ALLOWS USER TO PRINT A COLUMN OF THE TABLEAU'/
36400	     8  T35,'(TO SIX SIGNIFICANT FIGURE ACCURACY)')
 36500		WRITE(5,4020)
   36600	4020	FORMAT(' AROW',T25,'ALLOWS USER TO ADD A NEW ROW'/
  36700	     1  ' ACOL',T25,'ALLOWS USER TO ADD A NEW COLUMN'/
   36800	     2	' CENT',T25,'ALLOWS USER TO CHANGE ONE ENTRY OF THE TABLEAU'/
    36900	     3	' PENT',T25,'ALLOWS USER TO PRINT ONE ENTRY OF THE TABLEAU'/
37000	     4	T35,'(TO SEVEN SIGNIFICANT FIGURE ACCURACY)'/
37100	     5	' RETURN',T25,'RETURNS TABLEAU TO WHAT IT WAS'/
   37200	     6	T35,'BEFORE THE LAST PIVOT'/
  37300	     7	' SAVE',T25,'SAVES TABLEAU'/
  37400	     7	' RECALL',T25,'RECALLS TABLEAU SAVED BY SAVE OPTION'/
  37500	     8	' STOP',T25,'STOP')
 37600		GO TO 40
   37700	C *********************************************************************
 37800	C
 37900	C	DROW (DELETE ROW) OPTION SECTION
   38000	C
 38100	C *********************************************************************
 38200	5000	WRITE(5,5010)
    38300	5010	FORMAT(' INPUT THE NUMBER OF THE ROW TO BE DELETED?',$)
  38400		READ(5,5020,ERR=8998)J0
   38500	5020	FORMAT(I)
   38600		IF(J0.GE.P0.AND.J0.LE.P)GO TO 5021
  38700		WRITE(5,9000)
   38800		GO TO 40
   38900	5021	DO 5030 J = J0+1,P
    39000		DO 5030 I = N0,N
39100	5030	T(J-1,I) = T(J,I)
39200		P = P-1
    39300		IF(IP)P00 = P
   39400		GO TO 40
   39500	5500	WRITE(5,5510)
    39600	5510	FORMAT(' INPUT THE NUMBER OF THE COLUMN TO BE DELETED?',$)
    39700		READ(5,5520,ERR=8998)I0
   39800	5520	FORMAT(I)
   39900		IF(I0.GE.N0.AND.I0.LE.N)GO TO 5521
  40000		WRITE(5,9001)
   40100		GO TO 40
   40200	5521	DO 5530 I = I0+1,N
    40300		IND(I-1)=IND(I)
 40400		DO 5530 J = P0,P
40500	5530	T(J,I-1) = T(J,I)
40600		N = N-1
    40700		IF(IN)N00 = N
   40800		GO TO 40
   40900	C *********************************************************************
 41000	C
 41100	C	PROW (PRINT ROW) OPTION SECTION
    41200	C
 41300	C *********************************************************************
 41400	6000	WRITE(5,6010)
         41500	6010	FORMAT(' INPUT THE NUMBER OF THE ROW TO BE PRINTED?',$)
  41600		READ(5,6020,ERR=8998)J0
   41700	6020	FORMAT(I)
   41800		IF(J0.GE.P0.AND.J0.LE.P)GO TO 6021
  41900		WRITE(5,9000)
   42000		GO TO 40
   42100	6021	WRITE(5,6030)(T(J0,I),I=N0,N)
   42200	6030	FORMAT(5(1X,G10.4,1X))
42300		GO TO 40
   42400	C *********************************************************************
 42500	C
 42600	C	PCOL (PRINT COLUMN) OPTION SECTION
 42700	C
 42800	C *********************************************************************
 42900	6500	WRITE(5,6510)
    43000	6510	FORMAT(' INPUT THE NUMBER OF THE COLUMN TO BE PRINTED?',$)
    43100		READ(5,6520,ERR=8998)I0
   43200	6520	FORMAT(I)
   43300		IF(I0.GE.N0.AND.I0.LE.N)GO TO 6521
  43400		WRITE(5,9001)
   43500		GO TO 40
   43600	6521	WRITE(5,6530)(T(J,I0),J=P0,P)
   43700	6530	FORMAT(1X,G12.6)
 43800		GO TO 40
   43900	C *********************************************************************
 44000	C
 44100	C	AROW (ADD ROW) OPTION SECTION
 44200	C
 44300	C *********************************************************************
 44400	7000	P9 = P0-1
   44500		WRITE(5,7010)P9
 44600	7010	FORMAT(' INPUT THE NUMBER OF THE ROW
 44700	     1 JUST BEFORE THE ROW YOU
  44800	     2 WANT TO ADD,'/' (INPUT',I3,' IF YOU WANT A NEW FIRST ROW)?',$)
   44900		READ(5,7020,ERR=8998)J0
   45000	7020	FORMAT(I)
   45100		IF(J0.GE.P9.AND.J0.LE.P)GO TO 7030
  45200		WRITE(5,9000)
   45300		GO TO 40
   45400	7030	DO 7040 J= P,J0+1,-1
  45500		DO 7040 I = N0,N
45600	7040	T(J+1,I) = T(J,I)
45700		WRITE(5,7050)
   45800	7050	FORMAT(' INPUT THE NEW ROW?'$)
  45900		READ(5,7060,ERR=8998)(T(J0+1,I),I=N0,N)
  46000	7060	FORMAT(35F)
 46100		P = P+1
    46200		IF(IP)P00 = P
   46300		CALL COND(T,IND,P,N)
 46400		GO TO 40
   46500	C *********************************************************************
 46600	C
 46700	C	ACOL (ADD COLUMN) OPTION SECTION
   46800	C
 46900	C *********************************************************************
 47000	7500	N9 =N0-1
    47100		WRITE(5,7510)N9
 47200	7510	FORMAT(' INPUT THE NUMBER OF THE COLUMN JUST BEFORE THE
  47300	     1 COLUMN YOU WANT TO ADD,'/' (INPUT',I3,' IF YOU WANT A NEW
   47400	     2 FIRST COLUMN)?',$)
  47500		READ(5,7520,ERR=8998)I0
   47600	7520	FORMAT(I)
   47700		IF(I0.GE.N9.AND.I0.LE.N)GO TO 7530
  47800		WRITE(5,9001)
   47900		GO TO 40
   48000	7530	DO 7540 I = N,I0+1,-1
 48100		DO 7540 J = P0,P
48200	7540	T(J,I+1) = T(J,I)
48300		WRITE(5,7550)
   48400	7550	FORMAT(' INPUT THE NEW COLUMN (IN A ROW)?'$)
   48500		READ(5,7560,ERR=8998)(T(J,I0+1),J=P0,P)
  48600	7560	FORMAT(35F)
 48700		N = N+1
    48800		IF(IN)N00 = N
   48900		CALL COND(T,IND,P,N)
 49000		GO TO 40
   49100	C *********************************************************************
 49200	C
 49300	C	RETURN (TO TABLEAU BEFORE LAST PIVOT) OPTION SECTION
   49400	C
 49500	C *********************************************************************
 49600	8000	P = POLD
    49700		N = NOLD
   49800		IF(IP)P00 = P
   49900		IF(IN)N00 = N
   50000		DO 8001 I = N0,N
50100		IND(I) = INDOLD(I)
   50200		DO 8001 J = P0,P
50300	8001	T(J,I) = TOLD(J,I)
    50400		GO TO 40
   50500	C *********************************************************************
 50600	C
 50700	C	SAVE (TABLEAU) OPTION SECTION
 50800	C
 50900	C *********************************************************************
 51000	8200	PSAVE = P
   51100		NSAVE = N
  51200		DO 8201 I = N0,N
51300		INDSAVE(I) = IND(I)
  51400		DO 8201 J = P0,P
51500	8201	TSAVE(J,I) = T(J,I)
   51600		GO TO 40
   51700	C *********************************************************************
 51800	C
 51900	C	RECALL (SAVED TABLEAU) OPTION SECTION
   52000	C
 52100	C *********************************************************************
 52200	8400	P = PSAVE
   52300		N = NSAVE
  52400		IF(IP)P00 = P
   52500		IF(IN)N00 = N
   52600		DO 8401 I = N0,N
52700		IND(I) = INDSAVE(I)
  52800		DO 8401 J = P0,P
52900	8401	T(J,I) = TSAVE(J,I)
   53000		GO TO 40
   53100	8998	WRITE(5,8999)
    53200	8999	FORMAT(' INPUT DATA NOT IN CORECT FORM.  START OVER.')
   53300		GO TO 40
   53400	9000	FORMAT(' ILLEGAL ROW NUMBER')
   53500	9001	FORMAT(' ILLEGAL COLUMN NUMBER')
53600		END
   53700	C *********************************************************************
 53800	C
 53900	C---------------T=TABLEAU ARRAY, IND INDICATES WHICH COLS. HAVE ONLY
    54000	C--------------- ZEROS, ONES, AND MINUS ONES, P=HIGHEST INDEX OF A ROW,
 54100	C--------------- N=HIGHEST INDEX OF A COL.  SEE LIST OF IMPORTANT VARS.
 54200	C--------------- ON FIRST PAGE.
 54300	C---------------ALL ARGS ARE INPUT.  N0, N00, P0 ARE INPUT THRU COMMON.
 54400	C	SUBROUTINE MATOUT FOR MAIN PROGRAM LINPRO.F4
 54500	C
 54600	C *********************************************************************
 54700		SUBROUTINE MATOUT(T,IND,P,N)
   54800		LOGICAL IND,INDSAVE,INDOLD
54900		COMMON N0,P0,N00,P00
 55000		INTEGER P,P0,P00
55100		DIMENSION T(0/35,0/35),IND(0/35)
    55200	60	N1 = N0
       55300	61	M=0
 55400		DO 66 I = N1,N
  55500		M = M+4
    55600		IF(.NOT.IND(I))M = M+6
    55700		IF(M.GT.72)GO TO 69
  55800	66	CONTINUE
 55900		N2 = N
56000		GO TO 68
   56100	69	N2 = I-1
 56200	68	DO 99 I = N1,N2
    56300		IF(I.EQ.N00)GO TO 77
 56400		IF(IND(I))GO TO 72
   56500		IF(I.GT.9)GO TO 97
   56600		WRITE (5,75)I
   56700	75	FORMAT(3H+ X,I1,7X,$)
   56800		GO TO 99
   56900	97	WRITE(5,78)I
  57000	78	FORMAT(3H+ X,I2,6X,$)
   57100		GO TO 99
   57200	72	IF(I.GT.9)GO TO 95
 57300		WRITE(5,93)I
    57400	93	FORMAT(3H+ X,I1,1X,$)
   57500		GO TO 99
   57600	95	WRITE(5,96)I
  57700	96	FORMAT(3H+ X,I2,$)
 57800		GO TO 99
   57900	77	IF(IND(I))GO TO 88
 58000		WRITE(5,86)
58100	86	FORMAT(3H+ B,8X,$)
 58200		GO TO 99
   58300	88	WRITE(5,76)
   58400	76	FORMAT(3H+ B,2X$)
  58500	99	CONTINUE
 58600		DO 70 J = P0,P
  58700		WRITE(5,80)
58800	80	FORMAT(/)
58900		DO 70 I = N1,N2
 59000		IF(IND(I))GO TO 62
   59100		WRITE(5,65)T(J,I)
    59200	65	FORMAT(1H+,G9.3,1X,$)
   59300		GO TO 70
   59400	62	WRITE(5,63)T(J,I)
  59500	63	FORMAT(1H+,F3.0,1X,$)
   59600	70	CONTINUE
 59700		WRITE(5,80)
59800		IF(N2.GE.N)RETURN
    59900		N1 = N2+1
  60000		WRITE(5,401)
    60100	401	FORMAT()
60200		GO TO 61
   60300		END
   60400	C *********************************************************************
 60500	C
 60600	C---------------SEE DEP. OF T, IND, P, N IN SUBR. MATOUT JUST ABOVE
60700	C--------------- THIS SUBR. IS CALLED BY MAIN PROG. ST. 39 (SECTION
60800	C--------------- THAT SETS UP TABLEAU FORMAT AND INPUTS TABLEAU), CROW
  60900	C--------------- OPTION, CCOL OPTION, AROW OPTION, ACOL OPTION.  THIS
   61000	C--------------- SUBR. UPDATES IND(I) AFTER USER INPUTS TABLEAU, AND/OR
 61100	C--------------- ROWS AND/OR COLS.
   61200	C---------------N,P,T ARE INPUT.  IND IS RETURNED.  N0, P0 ARE INPUT
    61300	C--------------- THRU COMMON
    61400	C	SUBROUTINE COND FOR MAIN PROGRAM LINPRO.F4
   61500	C
 61600	C *********************************************************************
 61700		SUBROUTINE COND(T,IND,P,N)
61800		LOGICAL IND,INDOLD,INDSAVE
61900		COMMON N0,P0,N00,P00
 62000		INTEGER P,P0,P00
62100		DIMENSION T(0/35,0/35),IND(0/35)
    62200		DO 30 I = N0,N
  62300		IND(I) = .TRUE.
 62400		DO 10 J = P0,P
  62500		IF(T(J,I).NE.0..AND.T(J,I).NE.1..AND.T(J,I).NE.-1.)GO TO 20
  62600	10	CONTINUE
 62700		GO TO 30
   62800	20	IND(I) = .FALSE.
   62900	30	CONTINUE
 63000		END