SUBROUTINE SLVBLK ( BLOKS, INTEGS, NBLOKS, B, IPIVOT, X, IFLAG ) BLK00100 C THIS PROGRAM SOLVES THE LINEAR SYSTEM A*X = B WHERE A IS AN C ALMOST BLOCK DIAGONAL MATRIX. SUCH ALMOST BLOCK DIAGONAL MATRICES C ARISE NATURALLY IN PIECEWISE POLYNOMIAL INTERPOLATION OR APPROX- C IMATION AND IN FINITE ELEMENT METHODS FOR TWO-POINT BOUNDARY VALUE C PROBLEMS. THE PLU FACTORIZATION METHOD IS IMPLEMENTED HERE TO TAKE C ADVANTAGE OF THE SPECIAL STRUCTURE OF SUCH SYSTEMS FOR SAVINGS IN C COMPUTING TIME AND STORAGE REQUIREMENTS. C C PARAMETERS C BLOKS A ONE-DIMENSIONAL ARRAY, OF LENGTH C SUM( INTEGS(1,I)*INTEGS(2,I) , I = 1,NBLOKS ) C ON INPUT, CONTAINS THE BLOCKS OF THE ALMOST BLOCK DIAGONAL C MATRIX A . THE ARRAY INTEGS (SEE BELOW AND THE EXAMPLE) C DESCRIBES THE BLOCK STRUCTURE. C ON OUTPUT, CONTAINS CORRESPONDINGLY THE PLU FACTORIZATION C OF A (IF IFLAG .NE. 0). CERTAIN OF THE ENTRIES INTO BLOKS C ARE ARBITRARY (WHERE THE BLOCKS OVERLAP). C INTEGS INTEGER ARRAY DESCRIPTION OF THE BLOCK STRUCTURE OF A . C INTEGS(1,I) = NO. OF ROWS OF BLOCK I = NROW C INTEGS(2,I)= NO. OF COLUMNS OF BLOCK I = NCOL C INTEGS(3,I) = NO. OF ELIM. STEPS IN BLOCK I = LAST C I = 1,2,...,NBLOKS C THE LINEAR SYSTEM IS OF ORDER C N = SUM ( INTEGS(3,I) , I=1,...,NBLOKS ), C BUT THE TOTAL NUMBER OF ROWS IN THE BLOCKS IS C NBROWS = SUM( INTEGS(1,I) , I = 1,...,NBLOKS) C NBLOKS NUMBER OF BLOCKS C B RIGHT SIDE OF THE LINEAR SYSTEM, ARRAY OF LENGTH NBROWS. C CERTAIN OF THE ENTRIES ARE ARBITRARY, CORRESPONDING TO C ROWS OF THE BLOCKS WHICH OVERLAP (SEE BLOCK STRUCTURE AND C THE EXAMPLE BELOW). C IPIVOT ON OUTPUT, INTEGER ARRAY CONTAINING THE PIVOTING SEQUENCE C USED. LENGTH IS NBROWS C X ON OUTPUT, CONTAINS THE COMPUTED SOLUTION (IF IFLAG .NE. 0) C LENGTH IS N. C IFLAG ON OUTPUT, INTEGER C = (-1)**(NO. OF INTERCHANGES DURING FACTORIZATION) C IF A IS INVERTIBLE C = 0 IF A IS SINGULAR C C AUXILIARY PROGRAMS C FCBLOK (BLOKS,INTEGS,NBLOKS,IPIVOT,SCRTCH,IFLAG) FACTORS THE MATRIX C A , AND IS USED FOR THIS PURPOSE IN SLVBLK. ITS ARGUMENTS C ARE AS IN SLVBLK, EXCEPT FOR C SCRTCH = A WORK ARRAY OF LENGTH MAX(INTEGS(1,I)). C C SBBLOK (BLOKS,INTEGS,NBLOKS,IPIVOT,B,X) SOLVES THE SYSTEM A*X = B C ONCE A IS FACTORED. THIS IS DONE AUTOMATICALLY BY SLVBLK C FOR ONE RIGHT SIDE B, BUT SUBSEQUENT SOLUTIONS MAY BE C OBTAINED FOR ADDITIONAL B-VECTORS. THE ARGUMENTS ARE ALL C AS IN SLVBLK. C C DTBLOK (BLOKS,INTEGS,NBLOKS,IPIVOT,IFLAG,DETSGN,DETLOG) COMPUTES THE C DETERMINANT OF A ONCE SLVBLK OR FCBLOK HAS DONE THE FACT- C ORIZATION.THE FIRST FIVE ARGUMENTS ARE AS IN SLVBLK. C DETSGN = SIGN OF THE DETERMINANT C DETLOG = NATURAL LOG OF THE DETERMINANT C C ------ BLOCK STRUCTURE OF A ------ C THE NBLOKS BLOCKS ARE STORED CONSECUTIVELY IN THE ARRAY BLOKS . C THE FIRST BLOCK HAS ITS (1,1)-ENTRY AT BLOKS(1), AND, IF THE I-TH C BLOCK HAS ITS (1,1)-ENTRY AT BLOKS(INDEX(I)), THEN C INDEX(I+1) = INDEX(I) + NROW(I)*NCOL(I) . C THE BLOCKS ARE PIECED TOGETHER TO GIVE THE INTERESTING PART OF A C AS FOLLOWS. FOR I = 1,2,...,NBLOKS-1, THE (1,1)-ENTRY OF THE NEXT C BLOCK (THE (I+1)ST BLOCK ) CORRESPONDS TO THE (LAST+1,LAST+1)-ENTRY C OF THE CURRENT I-TH BLOCK. RECALL LAST = INTEGS(3,I) AND NOTE THAT C THIS MEANS THAT C A. EVERY BLOCK STARTS ON THE DIAGONAL OF A . C B. THE BLOCKS OVERLAP (USUALLY). THE ROWS OF THE (I+1)ST BLOCK C WHICH ARE OVERLAPPED BY THE I-TH BLOCK MAY BE ARBITRARILY DE- C FINED INITIALLY. THEY ARE OVERWRITTEN DURING ELIMINATION. C THE RIGHT SIDE FOR THE EQUATIONS IN THE I-TH BLOCK ARE STORED COR- C RESPONDINGLY AS THE LAST ENTRIES OF A PIECE OF B OF LENGTH NROW C (= INTEGS(1,I)) AND FOLLOWING IMMEDIATELY IN B THE CORRESPONDING C PIECE FOR THE RIGHT SIDE OF THE PRECEDING BLOCK, WITH THE RIGHT SIDE C FOR THE FIRST BLOCK STARTING AT B(1) . IN THIS, THE RIGHT SIDE FOR C AN EQUATION NEED ONLY BE SPECIFIED ONCE ON INPUT, IN THE FIRST BLOCK C IN WHICH THE EQUATION APPEARS. C C ------ EXAMPLE AND TEST DRIVER ------ C THE TEST DRIVER FOR THIS PACKAGE CONTAINS AN EXAMPLE, A LINEAR C SYSTEM OF ORDER 11, WHOSE NONZERO ENTRIES ARE INDICATED IN THE FOL- C LOWING SCHEMA BY THEIR ROW AND COLUMN INDEX MODULO 10. NEXT TO IT C ARE THE CONTENTS OF THE INTEGS ARRRAY WHEN THE MATRIX IS TAKEN TO C BE ALMOST BLOCK DIAGONAL WITH NBLOKS = 5, AND BELOW IT ARE THE FIVE C BLOCKS. C C NROW1 = 3, NCOL1 = 4 C 11 12 13 14 C 21 22 23 24 NROW2 = 3, NCOL2 = 3 C 31 32 33 34 C LAST1 = 2 43 44 45 C 53 54 55 NROW3 = 3, NCOL3 = 4 C LAST2 = 3 66 67 68 69 NROW4 = 3, NCOL4 = 4 C 76 77 78 79 NROW5 = 4, NCOL5 = 4 C 86 87 88 89 C LAST3 = 1 97 98 99 90 C LAST4 = 1 08 09 00 01 C 18 19 10 11 C LAST5 = 4 C C ACTUAL INPUT TO BLOKS SHOWN BY ROWS OF BLOCKS OF A . C (THE ** ITEMS ARE ARBITRARY, THIS STORAGE IS USED BY SLVBLK) C C 11 12 13 14 / ** ** ** / 66 67 68 69 / ** ** ** ** / ** ** ** ** C 21 22 23 24 / 43 44 45 / 76 77 78 79 / ** ** ** ** / ** ** ** ** C 31 32 33 34/ 53 54 55/ 86 87 88 89/ 97 98 99 90/ 08 09 00 01 C 18 19 10 11 C C INDEX = 1 INDEX = 13 INDEX = 22 INDEX = 34 INDEX = 46 C C ACTUAL RIGHT SIDE VALUES WITH ** FOR ARBITRARY VALUES C B1 B2 B3 ** B4 B5 B6 B7 B8 ** ** B9 ** ** B10 B11 C C (IT WOULD HAVE BEEN MORE EFFICIENT TO COMBINE BLOCK 3 WITH BLOCK 4) C INTEGER INTEGS(3,NBLOKS),IPIVOT(1),IFLAG REAL BLOKS(1),B(1),X(1) C IN THE CALL TO FCBLOK, X IS USED FOR TEMPORARY STORAGE. CALL FCBLOK(BLOKS,INTEGS,NBLOKS,IPIVOT,X,IFLAG) IF (IFLAG .EQ. 0) RETURN CALL SBBLOK(BLOKS,INTEGS,NBLOKS,IPIVOT,B,X) RETURN END SUBROUTINE FCBLOK ( BLOKS, INTEGS, NBLOKS, IPIVOT, SCRTCH, IFLAG )BLK12700 CALLS SUBROUTINES F A C T R B AND S H I F T B . C C F C B L O K SUPERVISES THE PLU FACTORIZATION WITH PIVOTING OF C SCALED ROWS OF THE ALMOST BLOCK DIAGONAL MATRIX STORED IN THE ARRAYS C B L O K S AND I N T E G S . C C FACTRB = SUBPROGRAM WHICH CARRIES OUT STEPS 1,...,LAST OF GAUSS C ELIMINATION (WITH PIVOTING) FOR AN INDIVIDUAL BLOCK. C SHIFTB = SUBPROGRAM WHICH SHIFTS THE REMAINING ROWS TO THE TOP OF C THE NEXT BLOCK C C PARAMETERS C BLOKS AN ARRAY THAT INITIALLY CONTAINS THE ALMOST BLOCK DIAGONAL C MATRIX A TO BE FACTORED, AND ON RETURN CONTAINS THE COM- C PUTED FACTORIZATION OF A . C INTEGS AN INTEGER ARRAY DESCRIBING THE BLOCK STRUCTURE OF A . C NBLOKS THE NUMBER OF BLOCKS IN A . C IPIVOT AN INTEGER ARRAY OF DIMENSION SUM (INTEGS(1,I) , I=1, C ...,NBLOKS) WHICH, ON RETURN, CONTAINS THE PIVOTING STRA- C TEGY USED. C SCRTCH WORK AREA REQUIRED, OF LENGTH MAX (INTEGS(1,I) , I=1, C ...,NBLOKS). C IFLAG OUTPUT PARAMETER, C = 0 IN CASE MATRIX WAS FOUND TO BE SINGULAR. C OTHERWISE, C = (-1)**(NUMBER OF ROW INTERCHANGES DURING FACTORIZATION) C INTEGER INTEGS(3,NBLOKS),IPIVOT(1),IFLAG, I,INDEX,INDEXB,INDEXN, * LAST,NCOL,NROW REAL BLOKS(1),SCRTCH(1) IFLAG = 1 INDEXB = 1 INDEXN = 1 I = 1 C LOOP OVER THE BLOCKS. I IS LOOP INDEX 10 INDEX = INDEXN NROW = INTEGS(1,I) NCOL = INTEGS(2,I) LAST = INTEGS(3,I) C CARRY OUT ELIMINATION ON THE I-TH BLOCK UNTIL NEXT BLOCK C ENTERS, I.E., FOR COLUMNS 1,...,LAST OF I-TH BLOCK. CALL FACTRB(BLOKS(INDEX),IPIVOT(INDEXB),SCRTCH,NROW,NCOL,LAST, * IFLAG) C CHECK FOR HAVING REACHED A SINGULAR BLOCK OR THE LAST BLOCK IF (IFLAG .EQ. 0 .OR. I .EQ. NBLOKS) * RETURN I = I+1 INDEXN = NROW*NCOL + INDEX C PUT THE REST OF THE I-TH BLOCK ONTO THE NEXT BLOCK CALL SHIFTB(BLOKS(INDEX),IPIVOT(INDEXB),NROW,NCOL,LAST, * BLOKS(INDEXN),INTEGS(1,I),INTEGS(2,I)) INDEXB = INDEXB + NROW GO TO 10 END SUBROUTINE FACTRB ( W, IPIVOT, D, NROW, NCOL, LAST, IFLAG ) BLK18200 C ADAPTED FROM P.132 OF *ELEMENTARY NUMER.ANALYSIS* BY CONTE-DE BOOR C C CONSTRUCTS A PARTIAL PLU FACTORIZATION, CORRESPONDING TO STEPS 1,..., C L A S T IN GAUSS ELIMINATION, FOR THE MATRIX W OF ORDER C ( N R O W , N C O L ), USING PIVOTING OF SCALED ROWS. C C PARAMETERS C W CONTAINS THE (NROW,NCOL) MATRIX TO BE PARTIALLY FACTORED C ON INPUT, AND THE PARTIAL FACTORIZATION ON OUTPUT. C IPIVOT AN INTEGER ARRAY OF LENGTH NROW CONTAINING A RECORD OF THE C PIVOTING STRATEGY USED. ROW IPIVOT(I) IS USED DURING THE C I-TH ELIMINATION STEP, I=1,...,LAST. C D A WORK ARRAY OF LENGTH NROW USED TO STORE ROW SIZES C TEMPORARILY. C NROW NUMBER OF ROWS OF W. C NCOL NUMBER OF COLUMNS OF W. C LAST NUMBER OF ELIMINATION STEPS TO BE CARRIED OUT. C IFLAG ON OUTPUT, EQUALS IFLAG ON INPUT TIMES (-1)**(NUMBER OF C ROW INTERCHANGES DURING THE FACTORIZATION PROCESS), IN C CASE NO ZERO PIVOT WAS ENCOUNTERED. C OTHERWISE, IFLAG = 0 ON OUTPUT. C INTEGER IPIVOT(NROW),NCOL,LAST,IFLAG, I,IPIVI,IPIVK,J,K,KP1 REAL W(NROW,NCOL),D(NROW), AWIKDI,COLMAX,RATIO,ROWMAX C INITIALIZE IPIVOT, D DO 10 I=1,NROW IPIVOT(I) = I ROWMAX = 0. DO 9 J=1,NCOL 9 ROWMAX = AMAX1(ROWMAX, ABS(W(I,J))) IF (ROWMAX .EQ. 0.) GO TO 999 10 D(I) = ROWMAX C GAUSS ELIMINATION WITH PIVOTING OF SCALED ROWS, LOOP OVER K=1,.,LAST K = 1 C AS PIVOT ROW FOR K-TH STEP, PICK AMONG THE ROWS NOT YET USED, C I.E., FROM ROWS IPIVOT(K),...,IPIVOT(NROW), THE ONE WHOSE K-TH C ENTRY (COMPARED TO THE ROW SIZE) IS LARGEST. THEN, IF THIS ROW C DOES NOT TURN OUT TO BE ROW IPIVOT(K), REDEFINE IPIVOT(K) AP- C PROPRIATELY AND RECORD THIS INTERCHANGE BY CHANGING THE SIGN C OF I F L A G . 11 IPIVK = IPIVOT(K) IF (K .EQ. NROW) GO TO 21 J = K KP1 = K+1 COLMAX = ABS(W(IPIVK,K))/D(IPIVK) C FIND THE (RELATIVELY) LARGEST PIVOT DO 15 I=KP1,NROW IPIVI = IPIVOT(I) AWIKDI = ABS(W(IPIVI,K))/D(IPIVI) IF (AWIKDI .LE. COLMAX) GO TO 15 COLMAX = AWIKDI J = I 15 CONTINUE IF (J .EQ. K) GO TO 16 IPIVK = IPIVOT(J) IPIVOT(J) = IPIVOT(K) IPIVOT(K) = IPIVK IFLAG = -IFLAG 16 CONTINUE C IF PIVOT ELEMENT IS TOO SMALL IN ABSOLUTE VALUE, DECLARE C MATRIX TO BE NONINVERTIBLE AND QUIT. IF (ABS(W(IPIVK,K))+D(IPIVK) .LE. D(IPIVK)) * GO TO 999 C OTHERWISE, SUBTRACT THE APPROPRIATE MULTIPLE OF THE PIVOT C ROW FROM REMAINING ROWS, I.E., THE ROWS IPIVOT(K+1),..., C IPIVOT(NROW), TO MAKE K-TH ENTRY ZERO. SAVE THE MULTIPLIER IN C ITS PLACE. DO 20 I=KP1,NROW IPIVI = IPIVOT(I) W(IPIVI,K) = W(IPIVI,K)/W(IPIVK,K) RATIO = -W(IPIVI,K) DO 20 J=KP1,NCOL 20 W(IPIVI,J) = RATIO*W(IPIVK,J) + W(IPIVI,J) K = KP1 C CHECK FOR HAVING REACHED THE NEXT BLOCK. IF (K .LE. LAST) GO TO 11 RETURN C IF LAST .EQ. NROW , CHECK NOW THAT PIVOT ELEMENT IN LAST ROW C IS NONZERO. 21 IF( ABS(W(IPIVK,NROW))+D(IPIVK) .GT. D(IPIVK) ) * RETURN C SINGULARITY FLAG SET 999 IFLAG = 0 RETURN END SUBROUTINE SHIFTB ( AI, IPIVOT, NROWI, NCOLI, LAST, BLK26800 * AI1, NROWI1, NCOLI1 ) C SHIFTS THE ROWS IN CURRENT BLOCK, AI, NOT USED AS PIVOT ROWS, IF C ANY, I.E., ROWS IPIVOT(LAST+1),...,IPIVOT(NROWI), ONTO THE FIRST C MMAX = NROW-LAST ROWS OF THE NEXT BLOCK, AI1, WITH COLUMN LAST+J OF C AI GOING TO COLUMN J , J=1,...,JMAX=NCOLI-LAST. THE REMAINING COL- C UMNS OF THESE ROWS OF AI1 ARE ZEROED OUT. C C PICTURE C C ORIGINAL SITUATION AFTER RESULTS IN A NEW BLOCK I+1 C LAST = 2 COLUMNS HAVE BEEN CREATED AND READY TO BE C DONE IN FACTRB (ASSUMING NO FACTORED BY NEXT FACTRB CALL. C INTERCHANGES OF ROWS) C 1 C X X 1X X X X X X X X C 1 C 0 X 1X X X 0 X X X X C BLOCK I 1 --------------- C NROWI = 4 0 0 1X X X 0 0 1X X X 0 01 C NCOLI = 5 1 1 1 C LAST = 2 0 0 1X X X 0 0 1X X X 0 01 C ------------------------------- 1 1 NEW C 1X X X X X 1X X X X X1 BLOCK C 1 1 1 I+1 C BLOCK I+1 1X X X X X 1X X X X X1 C NROWI1= 5 1 1 1 C NCOLI1= 5 1X X X X X 1X X X X X1 C ------------------------------- 1-------------1 C 1 C INTEGER IPIVOT(NROWI),LAST, IP,J,JMAX,JMAXP1,M,MMAX REAL AI(NROWI,NCOLI),AI1(NROWI1,NCOLI1) MMAX = NROWI - LAST JMAX = NCOLI - LAST IF (MMAX .LT. 1 .OR. JMAX .LT. 1) RETURN C PUT THE REMAINDER OF BLOCK I INTO AI1 DO 10 M=1,MMAX IP = IPIVOT(LAST+M) DO 10 J=1,JMAX 10 AI1(M,J) = AI(IP,LAST+J) IF (JMAX .EQ. NCOLI1) RETURN C ZERO OUT THE UPPER RIGHT CORNER OF AI1 JMAXP1 = JMAX + 1 DO 20 J=JMAXP1,NCOLI1 DO 20 M=1,MMAX 20 AI1(M,J) = 0. RETURN END SUBROUTINE SBBLOK ( BLOKS, INTEGS, NBLOKS, IPIVOT, B, X ) BLK31700 CALLS SUBROUTINES S U B F O R AND S U B B A K . C C SUPERVISES THE SOLUTION (BY FORWARD AND BACKWARD SUBSTITUTION) OF C THE LINEAR SYSTEM A*X = B FOR X, WITH THE PLU FACTORIZATION OF A C ALREADY GENERATED IN F C B L O K . INDIVIDUAL BLOCKS OF EQUATIONS C ARE SOLVED VIA S U B F O R AND S U B B A K . C C PARAMETERS C BLOKS, INTEGS, NBLOKS, IPIVOT ARE AS ON RETURN FROM FCBLOK. C B THE RIGHT SIDE, STORED CORRESPONDING TO THE STORAGE OF C THE EQUATIONS. SEE COMMENTS IN S L V B L K FOR DETAILS. C X SOLUTION VECTOR C INTEGER INTEGS(3,NBLOKS),IPIVOT(1), I,INDEX,INDEXB,INDEXX,J,LAST, * NBP1,NCOL,NROW REAL BLOKS(1),B(1),X(1) C C FORWARD SUBSTITUTION PASS C INDEX = 1 INDEXB = 1 INDEXX = 1 DO 20 I=1,NBLOKS NROW = INTEGS(1,I) LAST = INTEGS(3,I) CALL SUBFOR(BLOKS(INDEX),IPIVOT(INDEXB),NROW,LAST,B(INDEXB), * X(INDEXX)) INDEX = NROW*INTEGS(2,I) + INDEX INDEXB = INDEXB + NROW 20 INDEXX = INDEXX + LAST C C BACK SUBSTITUTION PASS C NBP1 = NBLOKS + 1 DO 30 J=1,NBLOKS I = NBP1 - J NROW = INTEGS(1,I) NCOL = INTEGS(2,I) LAST = INTEGS(3,I) INDEX = INDEX - NROW*NCOL INDEXB = INDEXB - NROW INDEXX = INDEXX - LAST 30 CALL SUBBAK(BLOKS(INDEX),IPIVOT(INDEXB),NROW,NCOL,LAST, * X(INDEXX)) RETURN END SUBROUTINE SUBFOR ( W, IPIVOT, NROW, LAST, B, X ) BLK36400 C CARRIES OUT THE FORWARD PASS OF SUBSTITUTION FOR THE CURRENT BLOCK, C I.E., THE ACTION ON THE RIGHT SIDE CORRESPONDING TO THE ELIMINATION C CARRIED OUT IN F A C T R B FOR THIS BLOCK. C AT THE END, X(J) CONTAINS THE RIGHT SIDE OF THE TRANSFORMED C IPIVOT(J)-TH EQUATION IN THIS BLOCK, J=1,...,NROW. THEN, SINCE C FOR I=1,...,NROW-LAST, B(NROW+I) IS GOING TO BE USED AS THE RIGHT C SIDE OF EQUATION I IN THE NEXT BLOCK (SHIFTED OVER THERE FROM C THIS BLOCK DURING FACTORIZATION), IT IS SET EQUAL TO X(LAST+I) HERE. C C PARAMETERS C W, IPIVOT, NROW, LAST ARE AS ON RETURN FROM FACTRB. C B(J) IS EXPECTED TO CONTAIN, ON INPUT, THE RIGHT SIDE OF J-TH C EQUATION FOR THIS BLOCK, J=1,...,NROW. C B(NROW+J) CONTAINS, ON OUTPUT, THE APPROPRIATELY MODIFIED RIGHT C SIDE FOR EQUATION J IN NEXT BLOCK, J=1,...,NROW-LAST. C X(J) CONTAINS, ON OUTPUT, THE APPROPRIATELY MODIFIED RIGHT C SIDE OF EQUATION IPIVOT(J) IN THIS BLOCK, J=1,...,LAST (AND C EVEN FOR J=LAST+1,...,NROW). C INTEGER IPIVOT(NROW), IP,JMAX,K C DIMENSION B(NROW + NROW-LAST) REAL W(NROW,LAST),B(1),X(NROW) IP = IPIVOT(1) X(1) = B(IP) IF (NROW .EQ. 1) GO TO 99 DO 15 K=2,NROW IP = IPIVOT(K) JMAX = AMIN0(K-1,LAST) SUM = 0. DO 14 J=1,JMAX 14 SUM = W(IP,J)*X(J) + SUM 15 X(K) = B(IP) - SUM C C TRANSFER MODIFIED RIGHT SIDES OF EQUATIONS IPIVOT(LAST+1),..., C IPIVOT(NROW) TO NEXT BLOCK. NROWML = NROW - LAST IF (NROWML .EQ. 0) GO TO 99 LASTP1 = LAST+1 DO 25 K=LASTP1,NROW 25 B(NROWML+K) = X(K) 99 RETURN END SUBROUTINE SUBBAK ( W, IPIVOT, NROW, NCOL, LAST, X ) BLK40700 C CARRIES OUT BACKSUBSTITUTION FOR CURRENT BLOCK. C C PARAMETERS C W, IPIVOT, NROW, NCOL, LAST ARE AS ON RETURN FROM FACTRB. C X(1),...,X(NCOL) CONTAINS, ON INPUT, THE RIGHT SIDE FOR THE C EQUATIONS IN THIS BLOCK AFTER BACKSUBSTITUTION HAS BEEN C CARRIED UP TO BUT NOT INCLUDING EQUATION IPIVOT(LAST). C MEANS THAT X(J) CONTAINS THE RIGHT SIDE OF EQUATION IPI- C VOT(J) AS MODIFIED DURING ELIMINATION, J=1,...,LAST, WHILE C FOR J .GT. LAST, X(J) IS ALREADY A COMPONENT OF THE SOLUT- C ION VECTOR. C X(1),...,X(NCOL) CONTAINS, ON OUTPUT, THE COMPONENTS OF THE SOLUT- C ION CORRESPONDING TO THE PRESENT BLOCK. C INTEGER IPIVOT(NROW),LAST, IP,J,K,KP1 REAL W(NROW,NCOL),X(NCOL), SUM K = LAST IP = IPIVOT(K) SUM = 0. IF (K .EQ. NCOL) GO TO 4 KP1 = K+1 2 DO 3 J=KP1,NCOL 3 SUM = W(IP,J)*X(J) + SUM 4 X(K) = (X(K) - SUM)/W(IP,K) IF (K .EQ. 1) RETURN KP1 = K K = K-1 IP = IPIVOT(K) SUM = 0. GO TO 2 END SUBROUTINE DTBLOK ( BLOKS, INTEGS, NBLOKS, IPIVOT, IFLAG, BLK43900 * DETSGN, DETLOG ) C COMPUTES THE DETERMINANT OF AN ALMOST BLOCK DIAGONAL MATRIX WHOSE C PLU FACTORIZATION HAS BEEN OBTAINED PREVIOUSLY IN FCBLOK. C *** THE LOGARITHM OF THE DETERMINANT IS COMPUTED INSTEAD OF THE C DETERMINANT ITSELF TO AVOID THE DANGER OF OVERFLOW OR UNDERFLOW C INHERENT IN THIS CALCULATION. C C PARAMETERS C BLOKS, INTEGS, NBLOKS, IPIVOT, IFLAG ARE AS ON RETURN FROM FCBLOK. C IN PARTICULAR, IFLAG = (-1)**(NUMBER OF INTERCHANGES DUR- C ING FACTORIZATION) IF SUCCESSFUL, OTHERWISE IFLAG = 0. C DETSGN ON OUTPUT, CONTAINS THE SIGN OF THE DETERMINANT. C DETLOG ON OUTPUT, CONTAINS THE NATURAL LOGARITHM OF THE DETERMI- C NANT IF DETERMINANT IS NOT ZERO. OTHERWISE CONTAINS 0. C INTEGER INTEGS(3,NBLOKS),IPIVOT(1),IFLAG, I,INDEXP,IP,K,LAST REAL BLOKS(1),DETSGN,DETLOG C DETSGN = IFLAG DETLOG = 0. IF (IFLAG .EQ. 0) RETURN INDEX = 0 INDEXP = 0 DO 2 I=1,NBLOKS NROW = INTEGS(1,I) LAST = INTEGS(3,I) DO 1 K=1,LAST IP = INDEX + NROW*(K-1) + IPIVOT(INDEXP+K) DETLOG = DETLOG + ALOG(ABS(BLOKS(IP))) 1 DETSGN = DETSGN*SIGN(1.,BLOKS(IP)) INDEX = NROW*INTEGS(2,I) + INDEX 2 INDEXP = INDEXP + NROW RETURN END C TEST PROGRAM FOR THE SOLVEBLOK PACKAGE SOLVES AN 11TH ORDER LINEAR BLK47400 C ALMOST BLOCK DIAGONAL SYSTEM. BLK47500 DIMENSION BLOKS(61),B(16),X(11), IPIVOT(16),INTEGS(15) BLK47600 C NROW NCOL LAST BLK47700 DATA INTEGS/ 3 , 4 , 2 BLK47800 2 , 3 , 3 , 3 BLK47900 3 , 3 , 4 , 1 BLK48000 4 , 3 , 4 , 1 BLK48100 5 , 4 , 4 , 4/ BLK48200 DATA BLOKS /.1,.2,-1., 2.,-.2,.3, -.1,-.2,-.3, -.1,4.,.3 BLK48300 2 ,0.,-.4,3., 0.,.4,.5, 0.,-5.,-.5 BLK48400 3 ,.6,.5,3., -.6,4.,.4, -.6,.5,-.4, 5.,-.5,.4 BLK48500 4 ,0.,0.,.3, 0.,0.,-.3, 0.,0.,.3, 0.,0.,7. BLK48600 5 ,0.,0.,.2,6., 0.,0.,-.2,.1, 0.,0.,-.2,-.1, BLK48700 5 0.,0.,8.,-.1/ BLK48800 DATA B /1.94,3.04,-.83, 0.,-3.54,2.75, 1.32,2.35,1.96, BLK48900 2 2*0.,1.52, 2*0.,.78,2.40 / BLK49000 NBLOKS = 5 BLK49100 N = 11 BLK49200 CALL SLVBLK ( BLOKS, INTEGS, NBLOKS, B, IPIVOT, X, IFLAG ) BLK49300 ERROR = 0. BLK49400 DO 10 I=1,N BLK49500 B(I) = FLOAT(12-I)/10. - X(I) BLK49600 10 ERROR = AMAX1(ERROR,ABS(B(I))) BLK49700 WRITE (6,610) IFLAG,ERROR, (IPIVOT(I),I=1,16), (I,X(I),B(I),I=1,N)BLK49800 610 FORMAT (28H CHECKOUT SOLVEBLOK ROUTINES/ BLK49900 * 8H IFLAG =,I2,17H, MAXIMUM ERROR =,E9.4// BLK50000 * 9H IPIVOT =,5(2X,3I2),I2// BLK50100 * 27H I X(I) ERROR(I)/(I3,F11.5,E13.5)) BLK50200 CALL DTBLOK ( BLOKS, INTEGS, NBLOKS, IPIVOT, IFLAG, BLK50300 * DETSGN, DETLOG ) BLK50400 DET = DETSGN*EXP(DETLOG) BLK50500 ERROR = DET - 2.418821899E6 BLK50600 WRITE (6,611) DET,ERROR BLK50700 611 FORMAT(//14H DETERMINANT =,E15.8,11H ERROR = ,E11.5) BLK50800 STOP BLK50900 END BLK51000 .