*ISAMAX INTEGER FUNCTION ISAMAX(N,SX,INCX) C***BEGIN PROLOGUE ISAMAX C***DATE WRITTEN 791001 (YYMMDD) C***REVISION DATE 820801 (YYMMDD) C***CATEGORY NO. D1A2 C***KEYWORDS BLAS,LINEAR ALGEBRA,MAXIMUM COMPONENT,VECTOR C***AUTHOR LAWSON, C. L., (JPL) C HANSON, R. J., (SNLA) C KINCAID, D. R., (U. OF TEXAS) C KROGH, F. T., (JPL) C***PURPOSE FIND LARGEST COMPONENT OF S.P. VECTOR C***DESCRIPTION C B L A S SUBPROGRAM C DESCRIPTION OF PARAMETERS C --INPUT-- C N NUMBER OF ELEMENTS IN INPUT VECTOR(S) C SX SINGLE PRECISION VECTOR WITH N ELEMENTS C INCX STORAGE SPACING BETWEEN ELEMENTS OF SX C --OUTPUT-- C ISAMAX SMALLEST INDEX (ZERO IF N .LE. 0) C FIND SMALLEST INDEX OF MAXIMUM MAGNITUDE OF SINGLE PRECISION SX. C ISAMAX = FIRST I, I = 1 TO N, TO MINIMIZE ABS(SX(1-INCX+I*INCX) C***REFERENCES LAWSON C.L., HANSON R.J., KINCAID D.R., KROGH F.T., C *BASIC LINEAR ALGEBRA SUBPROGRAMS FOR FORTRAN USAGE*, C ALGORITHM NO. 539, TRANSACTIONS ON MATHEMATICAL C SOFTWARE, VOLUME 5, NUMBER 3, SEPTEMBER 1979, 308-323 C***ROUTINES CALLED (NONE) C***END PROLOGUE ISAMAX C...SCALAR ARGUMENTS INTEGER + INCX,N C...ARRAY ARGUMENTS REAL SX(*) C...LOCAL SCALARS REAL SMAX,XMAG INTEGER + I,II,NS C...INTRINSIC FUNCTIONS INTRINSIC + ABS C***FIRST EXECUTABLE STATEMENT ISAMAX ISAMAX = 0 IF(N.LE.0) RETURN ISAMAX = 1 IF(N.LE.1)RETURN IF(INCX.EQ.1)GOTO 20 C CODE FOR INCREMENTS NOT EQUAL TO 1. SMAX = ABS(SX(1)) NS = N*INCX II = 1 DO 10 I=1,NS,INCX XMAG = ABS(SX(I)) IF(XMAG.LE.SMAX) GO TO 5 ISAMAX = II SMAX = XMAG 5 II = II + 1 10 CONTINUE RETURN C CODE FOR INCREMENTS EQUAL TO 1. 20 SMAX = ABS(SX(1)) DO 30 I = 2,N XMAG = ABS(SX(I)) IF(XMAG.LE.SMAX) GO TO 30 ISAMAX = I SMAX = XMAG 30 CONTINUE RETURN END *SASUM REAL FUNCTION SASUM(N,SX,INCX) C***BEGIN PROLOGUE SASUM C***DATE WRITTEN 791001 (YYMMDD) C***REVISION DATE 820801 (YYMMDD) C***CATEGORY NO. D1A3A C***KEYWORDS ADD,BLAS,LINEAR ALGEBRA,MAGNITUDE,SUM,VECTOR C***AUTHOR LAWSON, C. L., (JPL) C HANSON, R. J., (SNLA) C KINCAID, D. R., (U. OF TEXAS) C KROGH, F. T., (JPL) C***PURPOSE SUM OF MAGNITUDES OF S.P VECTOR COMPONENTS C***DESCRIPTION C B L A S SUBPROGRAM C DESCRIPTION OF PARAMETERS C --INPUT-- C N NUMBER OF ELEMENTS IN INPUT VECTOR(S) C SX SINGLE PRECISION VECTOR WITH N ELEMENTS C INCX STORAGE SPACING BETWEEN ELEMENTS OF SX C --OUTPUT-- C SASUM SINGLE PRECISION RESULT (ZERO IF N .LE. 0) C RETURNS SUM OF MAGNITUDES OF SINGLE PRECISION SX. C SASUM = SUM FROM 0 TO N-1 OF ABS(SX(1+I*INCX)) C***REFERENCES LAWSON C.L., HANSON R.J., KINCAID D.R., KROGH F.T., C *BASIC LINEAR ALGEBRA SUBPROGRAMS FOR FORTRAN USAGE*, C ALGORITHM NO. 539, TRANSACTIONS ON MATHEMATICAL C SOFTWARE, VOLUME 5, NUMBER 3, SEPTEMBER 1979, 308-323 C***ROUTINES CALLED (NONE) C***END PROLOGUE SASUM C...SCALAR ARGUMENTS INTEGER + INCX,N C...ARRAY ARGUMENTS REAL SX(*) C...LOCAL SCALARS INTEGER + I,M,MP1,NS C...INTRINSIC FUNCTIONS INTRINSIC + ABS,MOD C***FIRST EXECUTABLE STATEMENT SASUM SASUM = 0.0E0 IF(N.LE.0)RETURN IF(INCX.EQ.1)GOTO 20 C CODE FOR INCREMENTS NOT EQUAL TO 1. NS = N*INCX DO 10 I=1,NS,INCX SASUM = SASUM + ABS(SX(I)) 10 CONTINUE RETURN C CODE FOR INCREMENTS EQUAL TO 1. C CLEAN-UP LOOP SO REMAINING VECTOR LENGTH IS A MULTIPLE OF 6. 20 M = MOD(N,6) IF( M .EQ. 0 ) GO TO 40 DO 30 I = 1,M SASUM = SASUM + ABS(SX(I)) 30 CONTINUE IF( N .LT. 6 ) RETURN 40 MP1 = M + 1 DO 50 I = MP1,N,6 SASUM = SASUM + ABS(SX(I)) + ABS(SX(I + 1)) + ABS(SX(I + 2)) 1 + ABS(SX(I + 3)) + ABS(SX(I + 4)) + ABS(SX(I + 5)) 50 CONTINUE RETURN END *SAXPY SUBROUTINE SAXPY(N,SA,SX,INCX,SY,INCY) C***BEGIN PROLOGUE SAXPY C***DATE WRITTEN 791001 (YYMMDD) C***REVISION DATE 820801 (YYMMDD) C***CATEGORY NO. D1A7 C***KEYWORDS BLAS,LINEAR ALGEBRA,TRIAD,VECTOR C***AUTHOR LAWSON, C. L., (JPL) C HANSON, R. J., (SNLA) C KINCAID, D. R., (U. OF TEXAS) C KROGH, F. T., (JPL) C***PURPOSE S.P. COMPUTATION Y = A*X + Y C***DESCRIPTION C B L A S SUBPROGRAM C DESCRIPTION OF PARAMETERS C --INPUT-- C N NUMBER OF ELEMENTS IN INPUT VECTOR(S) C SA SINGLE PRECISION SCALAR MULTIPLIER C SX SINGLE PRECISION VECTOR WITH N ELEMENTS C INCX STORAGE SPACING BETWEEN ELEMENTS OF SX C SY SINGLE PRECISION VECTOR WITH N ELEMENTS C INCY STORAGE SPACING BETWEEN ELEMENTS OF SY C --OUTPUT-- C SY SINGLE PRECISION RESULT (UNCHANGED IF N .LE. 0) C OVERWRITE SINGLE PRECISION SY WITH SINGLE PRECISION SA*SX +SY. C FOR I = 0 TO N-1, REPLACE SY(LY+I*INCY) WITH SA*SX(LX+I*INCX) + C SY(LY+I*INCY), WHERE LX = 1 IF INCX .GE. 0, ELSE LX = (-INCX)*N C AND LY IS DEFINED IN A SIMILAR WAY USING INCY. C***REFERENCES LAWSON C.L., HANSON R.J., KINCAID D.R., KROGH F.T., C *BASIC LINEAR ALGEBRA SUBPROGRAMS FOR FORTRAN USAGE*, C ALGORITHM NO. 539, TRANSACTIONS ON MATHEMATICAL C SOFTWARE, VOLUME 5, NUMBER 3, SEPTEMBER 1979, 308-323 C***ROUTINES CALLED (NONE) C***END PROLOGUE SAXPY C...SCALAR ARGUMENTS REAL SA INTEGER + INCX,INCY,N C...ARRAY ARGUMENTS REAL SX(*),SY(*) C...LOCAL SCALARS INTEGER + I,IX,IY,M,MP1,NS C...INTRINSIC FUNCTIONS INTRINSIC + MOD C***FIRST EXECUTABLE STATEMENT SAXPY IF(N.LE.0.OR.SA.EQ.0.E0) RETURN IF(INCX.EQ.INCY) IF(INCX-1) 5,20,60 5 CONTINUE C CODE FOR NONEQUAL OR NONPOSITIVE INCREMENTS. IX = 1 IY = 1 IF(INCX.LT.0)IX = (-N+1)*INCX + 1 IF(INCY.LT.0)IY = (-N+1)*INCY + 1 DO 10 I = 1,N SY(IY) = SY(IY) + SA*SX(IX) IX = IX + INCX IY = IY + INCY 10 CONTINUE RETURN C CODE FOR BOTH INCREMENTS EQUAL TO 1 C CLEAN-UP LOOP SO REMAINING VECTOR LENGTH IS A MULTIPLE OF 4. 20 M = MOD(N,4) IF( M .EQ. 0 ) GO TO 40 DO 30 I = 1,M SY(I) = SY(I) + SA*SX(I) 30 CONTINUE IF( N .LT. 4 ) RETURN 40 MP1 = M + 1 DO 50 I = MP1,N,4 SY(I) = SY(I) + SA*SX(I) SY(I + 1) = SY(I + 1) + SA*SX(I + 1) SY(I + 2) = SY(I + 2) + SA*SX(I + 2) SY(I + 3) = SY(I + 3) + SA*SX(I + 3) 50 CONTINUE RETURN C CODE FOR EQUAL, POSITIVE, NONUNIT INCREMENTS. 60 CONTINUE NS = N*INCX DO 70 I=1,NS,INCX SY(I) = SA*SX(I) + SY(I) 70 CONTINUE RETURN END *SCHEX SUBROUTINE SCHEX(R,LDR,P,K,L,Z,LDZ,NZ,C,S,JOB) C***BEGIN PROLOGUE SCHEX C***DATE WRITTEN 780814 (YYMMDD) C***REVISION DATE 820801 (YYMMDD) C***CATEGORY NO. D7B C***KEYWORDS CHOLESKY DECOMPOSITION,EXCHANGE,LINEAR ALGEBRA,LINPACK, C MATRIX,POSITIVE DEFINITE C***AUTHOR STEWART, G. W., (U. OF MARYLAND) C***PURPOSE UPDATES THE CHOLESKY FACTORIZATION A=TRANS(R)*R OF A C POSITIVE DEFINITE MATRIX A OF ORDER P UNDER DIAGONAL C PERMUTATIONS OF THE FORM TRANS(E)*A*E WHERE E IS A C PERMUTATION MATRIX. C***DESCRIPTION C SCHEX UPDATES THE CHOLESKY FACTORIZATION C A = TRANS(R)*R C OF A POSITIVE DEFINITE MATRIX A OF ORDER P UNDER DIAGONAL C PERMUTATIONS OF THE FORM C TRANS(E)*A*E C WHERE E IS A PERMUTATION MATRIX. SPECIFICALLY, GIVEN C AN UPPER TRIANGULAR MATRIX R AND A PERMUTATION MATRIX C E (WHICH IS SPECIFIED BY K, L, AND JOB), SCHEX DETERMINES C AN ORTHOGONAL MATRIX U SUCH THAT C U*R*E = RR, C WHERE RR IS UPPER TRIANGULAR. AT THE USERS OPTION, THE C TRANSFORMATION U WILL BE MULTIPLIED INTO THE ARRAY Z. C IF A = TRANS(X)*X, SO THAT R IS THE TRIANGULAR PART OF THE C QR FACTORIZATION OF X, THEN RR IS THE TRIANGULAR PART OF THE C QR FACTORIZATION OF X*E, I.E., X WITH ITS COLUMNS PERMUTED. C FOR A LESS TERSE DESCRIPTION OF WHAT SCHEX DOES AND HOW C IT MAY BE APPLIED, SEE THE LINPACK GUIDE. C THE MATRIX Q IS DETERMINED AS THE PRODUCT U(L-K)*...*U(1) C OF PLANE ROTATIONS OF THE FORM C ( C(I) S(I) ) C ( ) , C ( -S(I) C(I) ) C WHERE C(I) IS REAL. THE ROWS THESE ROTATIONS OPERATE ON C ARE DESCRIBED BELOW. C THERE ARE TWO TYPES OF PERMUTATIONS, WHICH ARE DETERMINED C BY THE VALUE OF JOB. C 1. RIGHT CIRCULAR SHIFT (JOB = 1). C THE COLUMNS ARE REARRANGED IN THE FOLLOWING ORDER. C 1,...,K-1,L,K,K+1,...,L-1,L+1,...,P. C U IS THE PRODUCT OF L-K ROTATIONS U(I), WHERE U(I) C ACTS IN THE (L-I,L-I+1)-PLANE. C 2. LEFT CIRCULAR SHIFT (JOB = 2). C THE COLUMNS ARE REARRANGED IN THE FOLLOWING ORDER C 1,...,K-1,K+1,K+2,...,L,K,L+1,...,P. C U IS THE PRODUCT OF L-K ROTATIONS U(I), WHERE U(I) C ACTS IN THE (K+I-1,K+I)-PLANE. C ON ENTRY C R REAL(LDR,P), WHERE LDR .GE. P. C R CONTAINS THE UPPER TRIANGULAR FACTOR C THAT IS TO BE UPDATED. ELEMENTS OF R C BELOW THE DIAGONAL ARE NOT REFERENCED. C LDR INTEGER. C LDR IS THE LEADING DIMENSION OF THE ARRAY R. C P INTEGER. C P IS THE ORDER OF THE MATRIX R. C K INTEGER. C K IS THE FIRST COLUMN TO BE PERMUTED. C L INTEGER. C L IS THE LAST COLUMN TO BE PERMUTED. C L MUST BE STRICTLY GREATER THAN K. C Z REAL(LDZ,NZ), WHERE LDZ.GE.P. C Z IS AN ARRAY OF NZ P-VECTORS INTO WHICH THE C TRANSFORMATION U IS MULTIPLIED. Z IS C NOT REFERENCED IF NZ = 0. C LDZ INTEGER. C LDZ IS THE LEADING DIMENSION OF THE ARRAY Z. C NZ INTEGER. C NZ IS THE NUMBER OF COLUMNS OF THE MATRIX Z. C JOB INTEGER. C JOB DETERMINES THE TYPE OF PERMUTATION. C JOB = 1 RIGHT CIRCULAR SHIFT. C JOB = 2 LEFT CIRCULAR SHIFT. C ON RETURN C R CONTAINS THE UPDATED FACTOR. C Z CONTAINS THE UPDATED MATRIX Z. C C REAL(P). C C CONTAINS THE COSINES OF THE TRANSFORMING ROTATIONS. C S REAL(P). C S CONTAINS THE SINES OF THE TRANSFORMING ROTATIONS. C LINPACK. THIS VERSION DATED 08/14/78 . C G. W. STEWART, UNIVERSITY OF MARYLAND, ARGONNE NATIONAL LAB. C***REFERENCES DONGARRA J.J., BUNCH J.R., MOLER C.B., STEWART G.W., C *LINPACK USERS GUIDE*, SIAM, 1979. C***ROUTINES CALLED SROTG C***END PROLOGUE SCHEX C...SCALAR ARGUMENTS INTEGER + JOB,K,L,LDR,LDZ,NZ,P C...ARRAY ARGUMENTS REAL C(*),R(LDR,*),S(*),Z(LDZ,*) C...LOCAL SCALARS REAL T,T1 INTEGER + I,II,IL,IU,J,JJ,KM1,KP1,LM1,LMK C...EXTERNAL SUBROUTINES EXTERNAL + SROTG C...INTRINSIC FUNCTIONS INTRINSIC + MAX0,MIN0 C***FIRST EXECUTABLE STATEMENT SCHEX KM1 = K - 1 KP1 = K + 1 LMK = L - K LM1 = L - 1 C PERFORM THE APPROPRIATE TASK. GO TO (10,130), JOB C RIGHT CIRCULAR SHIFT. 10 CONTINUE C REORDER THE COLUMNS. DO 20 I = 1, L II = L - I + 1 S(I) = R(II,L) 20 CONTINUE DO 40 JJ = K, LM1 J = LM1 - JJ + K DO 30 I = 1, J R(I,J+1) = R(I,J) 30 CONTINUE R(J+1,J+1) = 0.0E0 40 CONTINUE IF (K .EQ. 1) GO TO 60 DO 50 I = 1, KM1 II = L - I + 1 R(I,K) = S(II) 50 CONTINUE 60 CONTINUE C CALCULATE THE ROTATIONS. T = S(1) DO 70 I = 1, LMK T1 = S(I) CALL SROTG(S(I+1),T,C(I),T1) S(I) = T1 T = S(I+1) 70 CONTINUE R(K,K) = T DO 90 J = KP1, P IL = MAX0(1,L-J+1) DO 80 II = IL, LMK I = L - II T = C(II)*R(I,J) + S(II)*R(I+1,J) R(I+1,J) = C(II)*R(I+1,J) - S(II)*R(I,J) R(I,J) = T 80 CONTINUE 90 CONTINUE C IF REQUIRED, APPLY THE TRANSFORMATIONS TO Z. IF (NZ .LT. 1) GO TO 120 DO 110 J = 1, NZ DO 100 II = 1, LMK I = L - II T = C(II)*Z(I,J) + S(II)*Z(I+1,J) Z(I+1,J) = C(II)*Z(I+1,J) - S(II)*Z(I,J) Z(I,J) = T 100 CONTINUE 110 CONTINUE 120 CONTINUE GO TO 260 C LEFT CIRCULAR SHIFT 130 CONTINUE C REORDER THE COLUMNS DO 140 I = 1, K II = LMK + I S(II) = R(I,K) 140 CONTINUE DO 160 J = K, LM1 DO 150 I = 1, J R(I,J) = R(I,J+1) 150 CONTINUE JJ = J - KM1 S(JJ) = R(J+1,J+1) 160 CONTINUE DO 170 I = 1, K II = LMK + I R(I,L) = S(II) 170 CONTINUE DO 180 I = KP1, L R(I,L) = 0.0E0 180 CONTINUE C REDUCTION LOOP. DO 220 J = K, P IF (J .EQ. K) GO TO 200 C APPLY THE ROTATIONS. IU = MIN0(J-1,L-1) DO 190 I = K, IU II = I - K + 1 T = C(II)*R(I,J) + S(II)*R(I+1,J) R(I+1,J) = C(II)*R(I+1,J) - S(II)*R(I,J) R(I,J) = T 190 CONTINUE 200 CONTINUE IF (J .GE. L) GO TO 210 JJ = J - K + 1 T = S(JJ) CALL SROTG(R(J,J),T,C(JJ),S(JJ)) 210 CONTINUE 220 CONTINUE C APPLY THE ROTATIONS TO Z. IF (NZ .LT. 1) GO TO 250 DO 240 J = 1, NZ DO 230 I = K, LM1 II = I - KM1 T = C(II)*Z(I,J) + S(II)*Z(I+1,J) Z(I+1,J) = C(II)*Z(I+1,J) - S(II)*Z(I,J) Z(I,J) = T 230 CONTINUE 240 CONTINUE 250 CONTINUE 260 CONTINUE RETURN END *SCOPY SUBROUTINE SCOPY(N,SX,INCX,SY,INCY) C***BEGIN PROLOGUE SCOPY C***DATE WRITTEN 791001 (YYMMDD) C***REVISION DATE 820801 (YYMMDD) C***CATEGORY NO. D1A5 C***KEYWORDS BLAS,COPY,LINEAR ALGEBRA,VECTOR C***AUTHOR LAWSON, C. L., (JPL) C HANSON, R. J., (SNLA) C KINCAID, D. R., (U. OF TEXAS) C KROGH, F. T., (JPL) C***PURPOSE COPY S.P. VECTOR Y = X C***DESCRIPTION C B L A S SUBPROGRAM C DESCRIPTION OF PARAMETERS C --INPUT-- C N NUMBER OF ELEMENTS IN INPUT VECTOR(S) C SX SINGLE PRECISION VECTOR WITH N ELEMENTS C INCX STORAGE SPACING BETWEEN ELEMENTS OF SX C SY SINGLE PRECISION VECTOR WITH N ELEMENTS C INCY STORAGE SPACING BETWEEN ELEMENTS OF SY C --OUTPUT-- C SY COPY OF VECTOR SX (UNCHANGED IF N .LE. 0) C COPY SINGLE PRECISION SX TO SINGLE PRECISION SY. C FOR I = 0 TO N-1, COPY SX(LX+I*INCX) TO SY(LY+I*INCY), C WHERE LX = 1 IF INCX .GE. 0, ELSE LX = (-INCX)*N, AND LY IS C DEFINED IN A SIMILAR WAY USING INCY. C***REFERENCES LAWSON C.L., HANSON R.J., KINCAID D.R., KROGH F.T., C *BASIC LINEAR ALGEBRA SUBPROGRAMS FOR FORTRAN USAGE*, C ALGORITHM NO. 539, TRANSACTIONS ON MATHEMATICAL C SOFTWARE, VOLUME 5, NUMBER 3, SEPTEMBER 1979, 308-323 C***ROUTINES CALLED (NONE) C***END PROLOGUE SCOPY C...SCALAR ARGUMENTS INTEGER + INCX,INCY,N C...ARRAY ARGUMENTS REAL SX(*),SY(*) C...LOCAL SCALARS INTEGER + I,IX,IY,M,MP1,NS C...INTRINSIC FUNCTIONS INTRINSIC + MOD C***FIRST EXECUTABLE STATEMENT SCOPY IF(N.LE.0)RETURN IF(INCX.EQ.INCY) IF(INCX-1) 5,20,60 5 CONTINUE C CODE FOR UNEQUAL OR NONPOSITIVE INCREMENTS. IX = 1 IY = 1 IF(INCX.LT.0)IX = (-N+1)*INCX + 1 IF(INCY.LT.0)IY = (-N+1)*INCY + 1 DO 10 I = 1,N SY(IY) = SX(IX) IX = IX + INCX IY = IY + INCY 10 CONTINUE RETURN C CODE FOR BOTH INCREMENTS EQUAL TO 1 C CLEAN-UP LOOP SO REMAINING VECTOR LENGTH IS A MULTIPLE OF 7. 20 M = MOD(N,7) IF( M .EQ. 0 ) GO TO 40 DO 30 I = 1,M SY(I) = SX(I) 30 CONTINUE IF( N .LT. 7 ) RETURN 40 MP1 = M + 1 DO 50 I = MP1,N,7 SY(I) = SX(I) SY(I + 1) = SX(I + 1) SY(I + 2) = SX(I + 2) SY(I + 3) = SX(I + 3) SY(I + 4) = SX(I + 4) SY(I + 5) = SX(I + 5) SY(I + 6) = SX(I + 6) 50 CONTINUE RETURN C CODE FOR EQUAL, POSITIVE, NONUNIT INCREMENTS. 60 CONTINUE NS = N*INCX DO 70 I=1,NS,INCX SY(I) = SX(I) 70 CONTINUE RETURN END *SDOT REAL FUNCTION SDOT(N,SX,INCX,SY,INCY) C***BEGIN PROLOGUE SDOT C***DATE WRITTEN 791001 (YYMMDD) C***REVISION DATE 820801 (YYMMDD) C***CATEGORY NO. D1A4 C***KEYWORDS BLAS,INNER PRODUCT,LINEAR ALGEBRA,VECTOR C***AUTHOR LAWSON, C. L., (JPL) C HANSON, R. J., (SNLA) C KINCAID, D. R., (U. OF TEXAS) C KROGH, F. T., (JPL) C***PURPOSE S.P. INNER PRODUCT OF S.P. VECTORS C***DESCRIPTION C B L A S SUBPROGRAM C DESCRIPTION OF PARAMETERS C --INPUT-- C N NUMBER OF ELEMENTS IN INPUT VECTOR(S) C SX SINGLE PRECISION VECTOR WITH N ELEMENTS C INCX STORAGE SPACING BETWEEN ELEMENTS OF SX C SY SINGLE PRECISION VECTOR WITH N ELEMENTS C INCY STORAGE SPACING BETWEEN ELEMENTS OF SY C --OUTPUT-- C SDOT SINGLE PRECISION DOT PRODUCT (ZERO IF N .LE. 0) C RETURNS THE DOT PRODUCT OF SINGLE PRECISION SX AND SY. C SDOT = SUM FOR I = 0 TO N-1 OF SX(LX+I*INCX) * SY(LY+I*INCY), C WHERE LX = 1 IF INCX .GE. 0, ELSE LX = (-INCX)*N, AND LY IS C DEFINED IN A SIMILAR WAY USING INCY. C***REFERENCES LAWSON C.L., HANSON R.J., KINCAID D.R., KROGH F.T., C *BASIC LINEAR ALGEBRA SUBPROGRAMS FOR FORTRAN USAGE*, C ALGORITHM NO. 539, TRANSACTIONS ON MATHEMATICAL C SOFTWARE, VOLUME 5, NUMBER 3, SEPTEMBER 1979, 308-323 C***ROUTINES CALLED (NONE) C***END PROLOGUE SDOT C...SCALAR ARGUMENTS INTEGER + INCX,INCY,N C...ARRAY ARGUMENTS REAL SX(*),SY(*) C...LOCAL SCALARS INTEGER + I,IX,IY,M,MP1,NS C...INTRINSIC FUNCTIONS INTRINSIC + MOD C***FIRST EXECUTABLE STATEMENT SDOT SDOT = 0.0E0 IF(N.LE.0)RETURN IF(INCX.EQ.INCY) IF(INCX-1)5,20,60 5 CONTINUE C CODE FOR UNEQUAL INCREMENTS OR NONPOSITIVE INCREMENTS. IX = 1 IY = 1 IF(INCX.LT.0)IX = (-N+1)*INCX + 1 IF(INCY.LT.0)IY = (-N+1)*INCY + 1 DO 10 I = 1,N SDOT = SDOT + SX(IX)*SY(IY) IX = IX + INCX IY = IY + INCY 10 CONTINUE RETURN C CODE FOR BOTH INCREMENTS EQUAL TO 1 C CLEAN-UP LOOP SO REMAINING VECTOR LENGTH IS A MULTIPLE OF 5. 20 M = MOD(N,5) IF( M .EQ. 0 ) GO TO 40 DO 30 I = 1,M SDOT = SDOT + SX(I)*SY(I) 30 CONTINUE IF( N .LT. 5 ) RETURN 40 MP1 = M + 1 DO 50 I = MP1,N,5 SDOT = SDOT + SX(I)*SY(I) + SX(I + 1)*SY(I + 1) + 1 SX(I + 2)*SY(I + 2) + SX(I + 3)*SY(I + 3) + SX(I + 4)*SY(I + 4) 50 CONTINUE RETURN C CODE FOR POSITIVE EQUAL INCREMENTS .NE.1. 60 CONTINUE NS=N*INCX DO 70 I=1,NS,INCX SDOT = SDOT + SX(I)*SY(I) 70 CONTINUE RETURN END *SNRM2 REAL FUNCTION SNRM2(N,SX,INCX) C***BEGIN PROLOGUE SNRM2 C***DATE WRITTEN 791001 (YYMMDD) C***REVISION DATE 820801 (YYMMDD) C***CATEGORY NO. D1A3B C***KEYWORDS BLAS,EUCLIDEAN,L2,LENGTH,LINEAR ALGEBRA,NORM,VECTOR C***AUTHOR LAWSON, C. L., (JPL) C HANSON, R. J., (SNLA) C KINCAID, D. R., (U. OF TEXAS) C KROGH, F. T., (JPL) C***PURPOSE EUCLIDEAN LENGTH (L2 NORM) OF S.P. VECTOR C***DESCRIPTION C B L A S SUBPROGRAM C DESCRIPTION OF PARAMETERS C --INPUT-- C N NUMBER OF ELEMENTS IN INPUT VECTOR(S) C SX SINGLE PRECISION VECTOR WITH N ELEMENTS C INCX STORAGE SPACING BETWEEN ELEMENTS OF SX C --OUTPUT-- C SNRM2 SINGLE PRECISION RESULT (ZERO IF N .LE. 0) C EUCLIDEAN NORM OF THE N-VECTOR STORED IN SX() WITH STORAGE C INCREMENT INCX . C IF N .LE. 0, RETURN WITH RESULT = 0. C IF N .GE. 1, THEN INCX MUST BE .GE. 1 C C. L. LAWSON, 1978 JAN 08 C FOUR PHASE METHOD USING TWO BUILT-IN CONSTANTS THAT ARE C HOPEFULLY APPLICABLE TO ALL MACHINES. C CUTLO = MAXIMUM OF SQRT(U/EPS) OVER ALL KNOWN MACHINES. C CUTHI = MINIMUM OF SQRT(V) OVER ALL KNOWN MACHINES. C WHERE C EPS = SMALLEST NO. SUCH THAT EPS + 1. .GT. 1. C U = SMALLEST POSITIVE NO. (UNDERFLOW LIMIT) C V = LARGEST NO. (OVERFLOW LIMIT) C BRIEF OUTLINE OF ALGORITHM.. C PHASE 1 SCANS ZERO COMPONENTS. C MOVE TO PHASE 2 WHEN A COMPONENT IS NONZERO AND .LE. CUTLO C MOVE TO PHASE 3 WHEN A COMPONENT IS .GT. CUTLO C MOVE TO PHASE 4 WHEN A COMPONENT IS .GE. CUTHI/M C WHERE M = N FOR X() REAL AND M = 2*N FOR COMPLEX. C VALUES FOR CUTLO AND CUTHI.. C FROM THE ENVIRONMENTAL PARAMETERS LISTED IN THE IMSL CONVERTER C DOCUMENT THE LIMITING VALUES ARE AS FOLLOWS.. C CUTLO, S.P. U/EPS = 2**(-102) FOR HONEYWELL. CLOSE SECONDS ARE C UNIVAC AND DEC AT 2**(-103) C THUS CUTLO = 2**(-51) = 4.44089E-16 C CUTHI, S.P. V = 2**127 FOR UNIVAC, HONEYWELL, AND DEC. C THUS CUTHI = 2**(63.5) = 1.30438E19 C CUTLO, D.P. U/EPS = 2**(-67) FOR HONEYWELL AND DEC. C THUS CUTLO = 2**(-33.5) = 8.23181D-11 C CUTHI, D.P. SAME AS S.P. CUTHI = 1.30438D19 C DATA CUTLO, CUTHI / 8.232D-11, 1.304D19 / C DATA CUTLO, CUTHI / 4.441E-16, 1.304E19 / C***REFERENCES LAWSON C.L., HANSON R.J., KINCAID D.R., KROGH F.T., C *BASIC LINEAR ALGEBRA SUBPROGRAMS FOR FORTRAN USAGE*, C ALGORITHM NO. 539, TRANSACTIONS ON MATHEMATICAL C SOFTWARE, VOLUME 5, NUMBER 3, SEPTEMBER 1979, 308-323 C***ROUTINES CALLED (NONE) C***END PROLOGUE SNRM2 C...SCALAR ARGUMENTS INTEGER + INCX,N C...ARRAY ARGUMENTS REAL SX(*) C...LOCAL SCALARS REAL CUTHI,CUTLO,HITEST,ONE,SUM,XMAX,ZERO INTEGER + I,J,NEXT,NN C...INTRINSIC FUNCTIONS INTRINSIC + ABS,FLOAT,SQRT C...DATA STATEMENTS DATA + ZERO,ONE/0.0E0,1.0E0/ DATA + CUTLO,CUTHI/4.441E-16,1.304E19/ C***FIRST EXECUTABLE STATEMENT SNRM2 XMAX = ZERO IF(N .GT. 0) GO TO 10 SNRM2 = ZERO GO TO 300 10 ASSIGN 30 TO NEXT SUM = ZERO NN = N * INCX C BEGIN MAIN LOOP I = 1 C 20 GO TO NEXT,(30, 50, 70, 110) 20 GO TO NEXT 30 IF( ABS(SX(I)) .GT. CUTLO) GO TO 85 ASSIGN 50 TO NEXT XMAX = ZERO C PHASE 1. SUM IS ZERO 50 IF( SX(I) .EQ. ZERO) GO TO 200 IF( ABS(SX(I)) .GT. CUTLO) GO TO 85 C PREPARE FOR PHASE 2. ASSIGN 70 TO NEXT GO TO 105 C PREPARE FOR PHASE 4. 100 I = J ASSIGN 110 TO NEXT SUM = (SUM / SX(I)) / SX(I) 105 XMAX = ABS(SX(I)) GO TO 115 C PHASE 2. SUM IS SMALL. C SCALE TO AVOID DESTRUCTIVE UNDERFLOW. 70 IF( ABS(SX(I)) .GT. CUTLO ) GO TO 75 C COMMON CODE FOR PHASES 2 AND 4. C IN PHASE 4 SUM IS LARGE. SCALE TO AVOID OVERFLOW. 110 IF( ABS(SX(I)) .LE. XMAX ) GO TO 115 SUM = ONE + SUM * (XMAX / SX(I))**2 XMAX = ABS(SX(I)) GO TO 200 115 SUM = SUM + (SX(I)/XMAX)**2 GO TO 200 C PREPARE FOR PHASE 3. 75 SUM = (SUM * XMAX) * XMAX C FOR REAL OR D.P. SET HITEST = CUTHI/N C FOR COMPLEX SET HITEST = CUTHI/(2*N) 85 HITEST = CUTHI/FLOAT( N ) C PHASE 3. SUM IS MID-RANGE. NO SCALING. DO 95 J =I,NN,INCX IF(ABS(SX(J)) .GE. HITEST) GO TO 100 95 SUM = SUM + SX(J)**2 SNRM2 = SQRT( SUM ) GO TO 300 200 CONTINUE I = I + INCX IF ( I .LE. NN ) GO TO 20 C END OF MAIN LOOP. C COMPUTE SQUARE ROOT AND ADJUST FOR SCALING. SNRM2 = XMAX * SQRT(SUM) 300 CONTINUE RETURN END *SPODI SUBROUTINE SPODI(A,LDA,N,DET,JOB) C***BEGIN PROLOGUE SPODI C***DATE WRITTEN 780814 (YYMMDD) C***REVISION DATE 820801 (YYMMDD) C***CATEGORY NO. D2B1B,D3B1B C***KEYWORDS DETERMINANT,FACTOR,INVERSE,LINEAR ALGEBRA,LINPACK,MATRIX, C POSITIVE DEFINITE C***AUTHOR MOLER, C. B., (U. OF NEW MEXICO) C***PURPOSE COMPUTES THE DETERMINANT AND INVERSE OF A CERTAIN C REAL SYMMETRIC POSITIVE DEFINITE MATRIX (SEE ABSTRACT) C USING THE FACTORS COMPUTED BY SPOCO, SPOFA OR SQRDC. C***DESCRIPTION C SPODI COMPUTES THE DETERMINANT AND INVERSE OF A CERTAIN C REAL SYMMETRIC POSITIVE DEFINITE MATRIX (SEE BELOW) C USING THE FACTORS COMPUTED BY SPOCO, SPOFA OR SQRDC. C ON ENTRY C A REAL(LDA, N) C THE OUTPUT A FROM SPOCO OR SPOFA C OR THE OUTPUT X FROM SQRDC. C LDA INTEGER C THE LEADING DIMENSION OF THE ARRAY A . C N INTEGER C THE ORDER OF THE MATRIX A . C JOB INTEGER C = 11 BOTH DETERMINANT AND INVERSE. C = 01 INVERSE ONLY. C = 10 DETERMINANT ONLY. C ON RETURN C A IF SPOCO OR SPOFA WAS USED TO FACTOR A , THEN C SPODI PRODUCES THE UPPER HALF OF INVERSE(A) . C IF SQRDC WAS USED TO DECOMPOSE X , THEN C SPODI PRODUCES THE UPPER HALF OF INVERSE(TRANS(X)*X), C WHERE TRANS(X) IS THE TRANSPOSE. C ELEMENTS OF A BELOW THE DIAGONAL ARE UNCHANGED. C IF THE UNITS DIGIT OF JOB IS ZERO, A IS UNCHANGED. C DET REAL(2) C DETERMINANT OF A OR OF TRANS(X)*X IF REQUESTED. C OTHERWISE NOT REFERENCED. C DETERMINANT = DET(1) * 10.0**DET(2) C WITH 1.0 .LE. DET(1) .LT. 10.0 C OR DET(1) .EQ. 0.0 . C ERROR CONDITION C A DIVISION BY ZERO WILL OCCUR IF THE INPUT FACTOR CONTAINS C A ZERO ON THE DIAGONAL AND THE INVERSE IS REQUESTED. C IT WILL NOT OCCUR IF THE SUBROUTINES ARE CALLED CORRECTLY C AND IF SPOCO OR SPOFA HAS SET INFO .EQ. 0 . C LINPACK. THIS VERSION DATED 08/14/78 . C CLEVE MOLER, UNIVERSITY OF NEW MEXICO, ARGONNE NATIONAL LAB. C***REFERENCES DONGARRA J.J., BUNCH J.R., MOLER C.B., STEWART G.W., C *LINPACK USERS GUIDE*, SIAM, 1979. C***ROUTINES CALLED SAXPY,SSCAL C***END PROLOGUE SPODI C...SCALAR ARGUMENTS INTEGER JOB,LDA,N C...ARRAY ARGUMENTS REAL A(LDA,*),DET(*) C...LOCAL SCALARS REAL S,T INTEGER I,J,JM1,K,KP1 C...EXTERNAL SUBROUTINES EXTERNAL SAXPY,SSCAL C...INTRINSIC FUNCTIONS INTRINSIC MOD C***FIRST EXECUTABLE STATEMENT SPODI IF (JOB/10 .EQ. 0) GO TO 70 DET(1) = 1.0E0 DET(2) = 0.0E0 S = 10.0E0 DO 50 I = 1, N DET(1) = A(I,I)**2*DET(1) C ...EXIT IF (DET(1) .EQ. 0.0E0) GO TO 60 10 IF (DET(1) .GE. 1.0E0) GO TO 20 DET(1) = S*DET(1) DET(2) = DET(2) - 1.0E0 GO TO 10 20 CONTINUE 30 IF (DET(1) .LT. S) GO TO 40 DET(1) = DET(1)/S DET(2) = DET(2) + 1.0E0 GO TO 30 40 CONTINUE 50 CONTINUE 60 CONTINUE 70 CONTINUE C COMPUTE INVERSE(R) IF (MOD(JOB,10) .EQ. 0) GO TO 140 DO 100 K = 1, N A(K,K) = 1.0E0/A(K,K) T = -A(K,K) CALL SSCAL(K-1,T,A(1,K),1) KP1 = K + 1 IF (N .LT. KP1) GO TO 90 DO 80 J = KP1, N T = A(K,J) A(K,J) = 0.0E0 CALL SAXPY(K,T,A(1,K),1,A(1,J),1) 80 CONTINUE 90 CONTINUE 100 CONTINUE C FORM INVERSE(R) * TRANS(INVERSE(R)) DO 130 J = 1, N JM1 = J - 1 IF (JM1 .LT. 1) GO TO 120 DO 110 K = 1, JM1 T = A(K,J) CALL SAXPY(K,T,A(1,J),1,A(1,K),1) 110 CONTINUE 120 CONTINUE T = A(J,J) CALL SSCAL(J,T,A(1,J),1) 130 CONTINUE 140 CONTINUE RETURN END *SQRDC SUBROUTINE SQRDC(X,LDX,N,P,QRAUX,JPVT,WORK,JOB) C***BEGIN PROLOGUE SQRDC C***DATE WRITTEN 780814 (YYMMDD) C***REVISION DATE 820801 (YYMMDD) C***CATEGORY NO. D5 C***KEYWORDS DECOMPOSITION,LINEAR ALGEBRA,LINPACK,MATRIX, C ORTHOGONAL TRIANGULAR C***AUTHOR STEWART, G. W., (U. OF MARYLAND) C***PURPOSE USES HOUSEHOLDER TRANSFORMATIONS TO COMPUTE THE QR C FACTORIZATION OF AN N BY P MATRIX X. COLUMN PIVOTING IS C A USERS OPTION. C***DESCRIPTION C SQRDC USES HOUSEHOLDER TRANSFORMATIONS TO COMPUTE THE QR C FACTORIZATION OF AN N BY P MATRIX X. COLUMN PIVOTING C BASED ON THE 2-NORMS OF THE REDUCED COLUMNS MAY BE C PERFORMED AT THE USER'S OPTION. C ON ENTRY C X REAL(LDX,P), WHERE LDX .GE. N. C X CONTAINS THE MATRIX WHOSE DECOMPOSITION IS TO BE C COMPUTED. C LDX INTEGER. C LDX IS THE LEADING DIMENSION OF THE ARRAY X. C N INTEGER. C N IS THE NUMBER OF ROWS OF THE MATRIX X. C P INTEGER. C P IS THE NUMBER OF COLUMNS OF THE MATRIX X. C JPVT INTEGER(P). C JPVT CONTAINS INTEGERS THAT CONTROL THE SELECTION C OF THE PIVOT COLUMNS. THE K-TH COLUMN X(K) OF X C IS PLACED IN ONE OF THREE CLASSES ACCORDING TO THE C VALUE OF JPVT(K). C IF JPVT(K) .GT. 0, THEN X(K) IS AN INITIAL C COLUMN. C IF JPVT(K) .EQ. 0, THEN X(K) IS A FREE COLUMN. C IF JPVT(K) .LT. 0, THEN X(K) IS A FINAL COLUMN. C BEFORE THE DECOMPOSITION IS COMPUTED, INITIAL COLUMNS C ARE MOVED TO THE BEGINNING OF THE ARRAY X AND FINAL C COLUMNS TO THE END. BOTH INITIAL AND FINAL COLUMNS C ARE FROZEN IN PLACE DURING THE COMPUTATION AND ONLY C FREE COLUMNS ARE MOVED. AT THE K-TH STAGE OF THE C REDUCTION, IF X(K) IS OCCUPIED BY A FREE COLUMN, C IT IS INTERCHANGED WITH THE FREE COLUMN OF LARGEST C REDUCED NORM. JPVT IS NOT REFERENCED IF C JOB .EQ. 0. C WORK REAL(P). C WORK IS A WORK ARRAY. WORK IS NOT REFERENCED IF C JOB .EQ. 0. C JOB INTEGER. C JOB IS AN INTEGER THAT INITIATES COLUMN PIVOTING. C IF JOB .EQ. 0, NO PIVOTING IS DONE. C IF JOB .NE. 0, PIVOTING IS DONE. C ON RETURN C X X CONTAINS IN ITS UPPER TRIANGLE THE UPPER C TRIANGULAR MATRIX R OF THE QR FACTORIZATION. C BELOW ITS DIAGONAL X CONTAINS INFORMATION FROM C WHICH THE ORTHOGONAL PART OF THE DECOMPOSITION C CAN BE RECOVERED. NOTE THAT IF PIVOTING HAS C BEEN REQUESTED, THE DECOMPOSITION IS NOT THAT C OF THE ORIGINAL MATRIX X BUT THAT OF X C WITH ITS COLUMNS PERMUTED AS DESCRIBED BY JPVT. C QRAUX REAL(P). C QRAUX CONTAINS FURTHER INFORMATION REQUIRED TO RECOVER C THE ORTHOGONAL PART OF THE DECOMPOSITION. C JPVT JPVT(K) CONTAINS THE INDEX OF THE COLUMN OF THE C ORIGINAL MATRIX THAT HAS BEEN INTERCHANGED INTO C THE K-TH COLUMN, IF PIVOTING WAS REQUESTED. C LINPACK. THIS VERSION DATED 08/14/78 . C G. W. STEWART, UNIVERSITY OF MARYLAND, ARGONNE NATIONAL LAB. C***REFERENCES DONGARRA J.J., BUNCH J.R., MOLER C.B., STEWART G.W., C *LINPACK USERS GUIDE*, SIAM, 1979. C***ROUTINES CALLED SAXPY,SDOT,SNRM2,SSCAL,SSWAP C***END PROLOGUE SQRDC C...SCALAR ARGUMENTS INTEGER + JOB,LDX,N,P C...ARRAY ARGUMENTS REAL QRAUX(*),WORK(*),X(LDX,*) INTEGER + JPVT(*) C...LOCAL SCALARS REAL MAXNRM,NRMXL,T,TT INTEGER + J,JJ,JP,L,LP1,LUP,MAXJ,PL,PU LOGICAL + NEGJ,SWAPJ C...EXTERNAL FUNCTIONS REAL SDOT,SNRM2 EXTERNAL + SDOT,SNRM2 C...EXTERNAL SUBROUTINES EXTERNAL + SAXPY,SSCAL,SSWAP C...INTRINSIC FUNCTIONS INTRINSIC + ABS,AMAX1,MIN0,SIGN,SQRT C***FIRST EXECUTABLE STATEMENT SQRDC PL = 1 PU = 0 IF (JOB .EQ. 0) GO TO 60 C PIVOTING HAS BEEN REQUESTED. REARRANGE THE COLUMNS C ACCORDING TO JPVT. DO 20 J = 1, P SWAPJ = JPVT(J) .GT. 0 NEGJ = JPVT(J) .LT. 0 JPVT(J) = J IF (NEGJ) JPVT(J) = -J IF (.NOT.SWAPJ) GO TO 10 IF (J .NE. PL) CALL SSWAP(N,X(1,PL),1,X(1,J),1) JPVT(J) = JPVT(PL) JPVT(PL) = J PL = PL + 1 10 CONTINUE 20 CONTINUE PU = P DO 50 JJ = 1, P J = P - JJ + 1 IF (JPVT(J) .GE. 0) GO TO 40 JPVT(J) = -JPVT(J) IF (J .EQ. PU) GO TO 30 CALL SSWAP(N,X(1,PU),1,X(1,J),1) JP = JPVT(PU) JPVT(PU) = JPVT(J) JPVT(J) = JP 30 CONTINUE PU = PU - 1 40 CONTINUE 50 CONTINUE 60 CONTINUE C COMPUTE THE NORMS OF THE FREE COLUMNS. IF (PU .LT. PL) GO TO 80 DO 70 J = PL, PU QRAUX(J) = SNRM2(N,X(1,J),1) WORK(J) = QRAUX(J) 70 CONTINUE 80 CONTINUE C PERFORM THE HOUSEHOLDER REDUCTION OF X. LUP = MIN0(N,P) DO 200 L = 1, LUP IF (L .LT. PL .OR. L .GE. PU) GO TO 120 C LOCATE THE COLUMN OF LARGEST NORM AND BRING IT C INTO THE PIVOT POSITION. MAXNRM = 0.0E0 MAXJ = L DO 100 J = L, PU IF (QRAUX(J) .LE. MAXNRM) GO TO 90 MAXNRM = QRAUX(J) MAXJ = J 90 CONTINUE 100 CONTINUE IF (MAXJ .EQ. L) GO TO 110 CALL SSWAP(N,X(1,L),1,X(1,MAXJ),1) QRAUX(MAXJ) = QRAUX(L) WORK(MAXJ) = WORK(L) JP = JPVT(MAXJ) JPVT(MAXJ) = JPVT(L) JPVT(L) = JP 110 CONTINUE 120 CONTINUE QRAUX(L) = 0.0E0 IF (L .EQ. N) GO TO 190 C COMPUTE THE HOUSEHOLDER TRANSFORMATION FOR COLUMN L. NRMXL = SNRM2(N-L+1,X(L,L),1) IF (NRMXL .EQ. 0.0E0) GO TO 180 IF (X(L,L) .NE. 0.0E0) NRMXL = SIGN(NRMXL,X(L,L)) CALL SSCAL(N-L+1,1.0E0/NRMXL,X(L,L),1) X(L,L) = 1.0E0 + X(L,L) C APPLY THE TRANSFORMATION TO THE REMAINING COLUMNS, C UPDATING THE NORMS. LP1 = L + 1 IF (P .LT. LP1) GO TO 170 DO 160 J = LP1, P T = -SDOT(N-L+1,X(L,L),1,X(L,J),1)/X(L,L) CALL SAXPY(N-L+1,T,X(L,L),1,X(L,J),1) IF (J .LT. PL .OR. J .GT. PU) GO TO 150 IF (QRAUX(J) .EQ. 0.0E0) GO TO 150 TT = 1.0E0 - (ABS(X(L,J))/QRAUX(J))**2 TT = AMAX1(TT,0.0E0) T = TT TT = 1.0E0 + 0.05E0*TT*(QRAUX(J)/WORK(J))**2 IF (TT .EQ. 1.0E0) GO TO 130 QRAUX(J) = QRAUX(J)*SQRT(T) GO TO 140 130 CONTINUE QRAUX(J) = SNRM2(N-L,X(L+1,J),1) WORK(J) = QRAUX(J) 140 CONTINUE 150 CONTINUE 160 CONTINUE 170 CONTINUE C SAVE THE TRANSFORMATION. QRAUX(L) = X(L,L) X(L,L) = -NRMXL 180 CONTINUE 190 CONTINUE 200 CONTINUE RETURN END *SQRSL SUBROUTINE SQRSL(X,LDX,N,K,QRAUX,Y,QY,QTY,B,RSD,XB,JOB,INFO) C***BEGIN PROLOGUE SQRSL C***DATE WRITTEN 780814 (YYMMDD) C***REVISION DATE 820801 (YYMMDD) C***CATEGORY NO. D9,D2A1 C***KEYWORDS LINEAR ALGEBRA,LINPACK,MATRIX,ORTHOGONAL TRIANGULAR,SOLVE C***AUTHOR STEWART, G. W., (U. OF MARYLAND) C***PURPOSE APPLIES THE OUTPUT OF SQRDC TO COMPUTE COORDINATE TRANS- C FORMATIONS PROJECTIONS, AND LEAST SQUARES SOLUTIONS. C***DESCRIPTION C SQRSL APPLIES THE OUTPUT OF SQRDC TO COMPUTE COORDINATE C TRANSFORMATIONS, PROJECTIONS, AND LEAST SQUARES SOLUTIONS. C FOR K .LE. MIN(N,P), LET XK BE THE MATRIX C XK = (X(JPVT(1)),X(JPVT(2)), ... ,X(JPVT(K))) C FORMED FROM COLUMNNS JPVT(1), ... ,JPVT(K) OF THE ORIGINAL C N X P MATRIX X THAT WAS INPUT TO SQRDC (IF NO PIVOTING WAS C DONE, XK CONSISTS OF THE FIRST K COLUMNS OF X IN THEIR C ORIGINAL ORDER). SQRDC PRODUCES A FACTORED ORTHOGONAL MATRIX Q C AND AN UPPER TRIANGULAR MATRIX R SUCH THAT C XK = Q * (R) C (0) C THIS INFORMATION IS CONTAINED IN CODED FORM IN THE ARRAYS C X AND QRAUX. C ON ENTRY C X REAL(LDX,P) C X CONTAINS THE OUTPUT OF SQRDC. C LDX INTEGER C LDX IS THE LEADING DIMENSION OF THE ARRAY X. C N INTEGER C N IS THE NUMBER OF ROWS OF THE MATRIX XK. IT MUST C HAVE THE SAME VALUE AS N IN SQRDC. C K INTEGER C K IS THE NUMBER OF COLUMNS OF THE MATRIX XK. K C MUST NOT BE GREATER THAN MIN(N,P), WHERE P IS THE C SAME AS IN THE CALLING SEQUENCE TO SQRDC. C QRAUX REAL(P) C QRAUX CONTAINS THE AUXILIARY OUTPUT FROM SQRDC. C Y REAL(N) C Y CONTAINS AN N-VECTOR THAT IS TO BE MANIPULATED C BY SQRSL. C JOB INTEGER C JOB SPECIFIES WHAT IS TO BE COMPUTED. JOB HAS C THE DECIMAL EXPANSION ABCDE, WITH THE FOLLOWING C MEANING. C IF A .NE. 0, COMPUTE QY. C IF B,C,D, OR E .NE. 0, COMPUTE QTY. C IF C .NE. 0, COMPUTE B. C IF D .NE. 0, COMPUTE RSD. C IF E .NE. 0, COMPUTE XB. C NOTE THAT A REQUEST TO COMPUTE B, RSD, OR XB C AUTOMATICALLY TRIGGERS THE COMPUTATION OF QTY, FOR C WHICH AN ARRAY MUST BE PROVIDED IN THE CALLING C SEQUENCE. C ON RETURN C QY REAL(N). C QY CONTAINS Q*Y, IF ITS COMPUTATION HAS BEEN C REQUESTED. C QTY REAL(N). C QTY CONTAINS TRANS(Q)*Y, IF ITS COMPUTATION HAS C BEEN REQUESTED. HERE TRANS(Q) IS THE C TRANSPOSE OF THE MATRIX Q. C B REAL(K) C B CONTAINS THE SOLUTION OF THE LEAST SQUARES PROBLEM C MINIMIZE NORM2(Y - XK*B), C IF ITS COMPUTATION HAS BEEN REQUESTED. (NOTE THAT C IF PIVOTING WAS REQUESTED IN SQRDC, THE J-TH C COMPONENT OF B WILL BE ASSOCIATED WITH COLUMN JPVT(J) C OF THE ORIGINAL MATRIX X THAT WAS INPUT INTO SQRDC.) C RSD REAL(N). C RSD CONTAINS THE LEAST SQUARES RESIDUAL Y - XK*B, C IF ITS COMPUTATION HAS BEEN REQUESTED. RSD IS C ALSO THE ORTHOGONAL PROJECTION OF Y ONTO THE C ORTHOGONAL COMPLEMENT OF THE COLUMN SPACE OF XK. C XB REAL(N). C XB CONTAINS THE LEAST SQUARES APPROXIMATION XK*B, C IF ITS COMPUTATION HAS BEEN REQUESTED. XB IS ALSO C THE ORTHOGONAL PROJECTION OF Y ONTO THE COLUMN SPACE C OF X. C INFO INTEGER. C INFO IS ZERO UNLESS THE COMPUTATION OF B HAS C BEEN REQUESTED AND R IS EXACTLY SINGULAR. IN C THIS CASE, INFO IS THE INDEX OF THE FIRST ZERO C DIAGONAL ELEMENT OF R AND B IS LEFT UNALTERED. C THE PARAMETERS QY, QTY, B, RSD, AND XB ARE NOT REFERENCED C IF THEIR COMPUTATION IS NOT REQUESTED AND IN THIS CASE C CAN BE REPLACED BY DUMMY VARIABLES IN THE CALLING PROGRAM. C TO SAVE STORAGE, THE USER MAY IN SOME CASES USE THE SAME C ARRAY FOR DIFFERENT PARAMETERS IN THE CALLING SEQUENCE. A C FREQUENTLY OCCURING EXAMPLE IS WHEN ONE WISHES TO COMPUTE C ANY OF B, RSD, OR XB AND DOES NOT NEED Y OR QTY. IN THIS C CASE ONE MAY IDENTIFY Y, QTY, AND ONE OF B, RSD, OR XB, WHILE C PROVIDING SEPARATE ARRAYS FOR ANYTHING ELSE THAT IS TO BE C COMPUTED. THUS THE CALLING SEQUENCE C CALL SQRSL(X,LDX,N,K,QRAUX,Y,DUM,Y,B,Y,DUM,110,INFO) C WILL RESULT IN THE COMPUTATION OF B AND RSD, WITH RSD C OVERWRITING Y. MORE GENERALLY, EACH ITEM IN THE FOLLOWING C LIST CONTAINS GROUPS OF PERMISSIBLE IDENTIFICATIONS FOR C A SINGLE CALLINNG SEQUENCE. C 1. (Y,QTY,B) (RSD) (XB) (QY) C 2. (Y,QTY,RSD) (B) (XB) (QY) C 3. (Y,QTY,XB) (B) (RSD) (QY) C 4. (Y,QY) (QTY,B) (RSD) (XB) C 5. (Y,QY) (QTY,RSD) (B) (XB) C 6. (Y,QY) (QTY,XB) (B) (RSD) C IN ANY GROUP THE VALUE RETURNED IN THE ARRAY ALLOCATED TO C THE GROUP CORRESPONDS TO THE LAST MEMBER OF THE GROUP. C LINPACK. THIS VERSION DATED 08/14/78 . C G. W. STEWART, UNIVERSITY OF MARYLAND, ARGONNE NATIONAL LAB. C***REFERENCES DONGARRA J.J., BUNCH J.R., MOLER C.B., STEWART G.W., C *LINPACK USERS GUIDE*, SIAM, 1979. C***ROUTINES CALLED SAXPY,SCOPY,SDOT C***END PROLOGUE SQRSL C...SCALAR ARGUMENTS INTEGER + INFO,JOB,K,LDX,N C...ARRAY ARGUMENTS REAL B(*),QRAUX(*),QTY(*),QY(*),RSD(*),X(LDX,*),XB(*),Y(*) C...LOCAL SCALARS REAL T,TEMP INTEGER + I,J,JJ,JU,KP1 LOGICAL + CB,CQTY,CQY,CR,CXB C...EXTERNAL FUNCTIONS REAL SDOT EXTERNAL + SDOT C...EXTERNAL SUBROUTINES EXTERNAL + SAXPY,SCOPY C...INTRINSIC FUNCTIONS INTRINSIC + MIN0,MOD C***FIRST EXECUTABLE STATEMENT SQRSL C SET INFO FLAG. INFO = 0 C DETERMINE WHAT IS TO BE COMPUTED. CQY = JOB/10000 .NE. 0 CQTY = MOD(JOB,10000) .NE. 0 CB = MOD(JOB,1000)/100 .NE. 0 CR = MOD(JOB,100)/10 .NE. 0 CXB = MOD(JOB,10) .NE. 0 JU = MIN0(K,N-1) C SPECIAL ACTION WHEN N=1. IF (JU .NE. 0) GO TO 40 IF (CQY) QY(1) = Y(1) IF (CQTY) QTY(1) = Y(1) IF (CXB) XB(1) = Y(1) IF (.NOT.CB) GO TO 30 IF (X(1,1) .NE. 0.0E0) GO TO 10 INFO = 1 GO TO 20 10 CONTINUE B(1) = Y(1)/X(1,1) 20 CONTINUE 30 CONTINUE IF (CR) RSD(1) = 0.0E0 GO TO 250 40 CONTINUE C SET UP TO COMPUTE QY OR QTY. IF (CQY) CALL SCOPY(N,Y,1,QY,1) IF (CQTY) CALL SCOPY(N,Y,1,QTY,1) IF (.NOT.CQY) GO TO 70 C COMPUTE QY. DO 60 JJ = 1, JU J = JU - JJ + 1 IF (QRAUX(J) .EQ. 0.0E0) GO TO 50 TEMP = X(J,J) X(J,J) = QRAUX(J) T = -SDOT(N-J+1,X(J,J),1,QY(J),1)/X(J,J) CALL SAXPY(N-J+1,T,X(J,J),1,QY(J),1) X(J,J) = TEMP 50 CONTINUE 60 CONTINUE 70 CONTINUE IF (.NOT.CQTY) GO TO 100 C COMPUTE TRANS(Q)*Y. DO 90 J = 1, JU IF (QRAUX(J) .EQ. 0.0E0) GO TO 80 TEMP = X(J,J) X(J,J) = QRAUX(J) T = -SDOT(N-J+1,X(J,J),1,QTY(J),1)/X(J,J) CALL SAXPY(N-J+1,T,X(J,J),1,QTY(J),1) X(J,J) = TEMP 80 CONTINUE 90 CONTINUE 100 CONTINUE C SET UP TO COMPUTE B, RSD, OR XB. IF (CB) CALL SCOPY(K,QTY,1,B,1) KP1 = K + 1 IF (CXB) CALL SCOPY(K,QTY,1,XB,1) IF (CR .AND. K .LT. N) CALL SCOPY(N-K,QTY(KP1),1,RSD(KP1),1) IF (.NOT.CXB .OR. KP1 .GT. N) GO TO 120 DO 110 I = KP1, N XB(I) = 0.0E0 110 CONTINUE 120 CONTINUE IF (.NOT.CR) GO TO 140 DO 130 I = 1, K RSD(I) = 0.0E0 130 CONTINUE 140 CONTINUE IF (.NOT.CB) GO TO 190 C COMPUTE B. DO 170 JJ = 1, K J = K - JJ + 1 IF (X(J,J) .NE. 0.0E0) GO TO 150 INFO = J C ......EXIT GO TO 180 150 CONTINUE B(J) = B(J)/X(J,J) IF (J .EQ. 1) GO TO 160 T = -B(J) CALL SAXPY(J-1,T,X(1,J),1,B,1) 160 CONTINUE 170 CONTINUE 180 CONTINUE 190 CONTINUE IF (.NOT.CR .AND. .NOT.CXB) GO TO 240 C COMPUTE RSD OR XB AS REQUIRED. DO 230 JJ = 1, JU J = JU - JJ + 1 IF (QRAUX(J) .EQ. 0.0E0) GO TO 220 TEMP = X(J,J) X(J,J) = QRAUX(J) IF (.NOT.CR) GO TO 200 T = -SDOT(N-J+1,X(J,J),1,RSD(J),1)/X(J,J) CALL SAXPY(N-J+1,T,X(J,J),1,RSD(J),1) 200 CONTINUE IF (.NOT.CXB) GO TO 210 T = -SDOT(N-J+1,X(J,J),1,XB(J),1)/X(J,J) CALL SAXPY(N-J+1,T,X(J,J),1,XB(J),1) 210 CONTINUE X(J,J) = TEMP 220 CONTINUE 230 CONTINUE 240 CONTINUE 250 CONTINUE RETURN END *SROT SUBROUTINE SROT(N,SX,INCX,SY,INCY,SC,SS) C***BEGIN PROLOGUE SROT C***DATE WRITTEN 791001 (YYMMDD) C***REVISION DATE 820801 (YYMMDD) C***CATEGORY NO. D1A8 C***KEYWORDS BLAS,GIVENS ROTATION,LINEAR ALGEBRA,VECTOR C***AUTHOR LAWSON, C. L., (JPL) C HANSON, R. J., (SNLA) C KINCAID, D. R., (U. OF TEXAS) C KROGH, F. T., (JPL) C***PURPOSE APPLY S.P. GIVENS ROTATION C***DESCRIPTION C B L A S SUBPROGRAM C DESCRIPTION OF PARAMETERS C --INPUT-- C N NUMBER OF ELEMENTS IN INPUT VECTOR(S) C SX SINGLE PRECISION VECTOR WITH N ELEMENTS C INCX STORAGE SPACING BETWEEN ELEMENTS OF SX C SY SINGLE PRECISION VECTOR WITH N ELEMENTS C INCY STORAGE SPACING BETWEEN ELEMENTS OF SY C SC ELEMENT OF ROTATION MATRIX C SS ELEMENT OF ROTATION MATRIX C --OUTPUT-- C SX ROTATED VECTOR SX (UNCHANGED IF N .LE. 0) C SY ROTATED VECTOR SY (UNCHANGED IF N .LE. 0) C MULTIPLY THE 2 X 2 MATRIX ( SC SS) TIMES THE 2 X N MATRIX (SX**T) C (-SS SC) (SY**T) C WHERE **T INDICATES TRANSPOSE. THE ELEMENTS OF SX ARE IN C SX(LX+I*INCX), I = 0 TO N-1, WHERE LX = 1 IF INCX .GE. 0, ELSE C LX = (-INCX)*N, AND SIMILARLY FOR SY USING LY AND INCY. C***REFERENCES LAWSON C.L., HANSON R.J., KINCAID D.R., KROGH F.T., C *BASIC LINEAR ALGEBRA SUBPROGRAMS FOR FORTRAN USAGE*, C ALGORITHM NO. 539, TRANSACTIONS ON MATHEMATICAL C SOFTWARE, VOLUME 5, NUMBER 3, SEPTEMBER 1979, 308-323 C***ROUTINES CALLED (NONE) C***END PROLOGUE SROT C...SCALAR ARGUMENTS REAL SC,SS INTEGER + INCX,INCY,N C...ARRAY ARGUMENTS REAL SX(*),SY(*) C...LOCAL SCALARS REAL ONE,W,Z,ZERO INTEGER + I,KX,KY,NSTEPS C...DATA STATEMENTS DATA + ZERO,ONE/0.E0,1.E0/ C***FIRST EXECUTABLE STATEMENT SROT IF(N .LE. 0 .OR. (SS .EQ. ZERO .AND. SC .EQ. ONE)) GO TO 40 IF(.NOT. (INCX .EQ. INCY .AND. INCX .GT. 0)) GO TO 20 NSTEPS=INCX*N DO 10 I=1,NSTEPS,INCX W=SX(I) Z=SY(I) SX(I)=SC*W+SS*Z SY(I)=-SS*W+SC*Z 10 CONTINUE GO TO 40 20 CONTINUE KX=1 KY=1 IF(INCX .LT. 0) KX=1-(N-1)*INCX IF(INCY .LT. 0) KY=1-(N-1)*INCY DO 30 I=1,N W=SX(KX) Z=SY(KY) SX(KX)=SC*W+SS*Z SY(KY)=-SS*W+SC*Z KX=KX+INCX KY=KY+INCY 30 CONTINUE 40 CONTINUE RETURN END *SROTG SUBROUTINE SROTG(SA,SB,SC,SS) C***BEGIN PROLOGUE SROTG C***DATE WRITTEN 791001 (YYMMDD) C***REVISION DATE 820801 (YYMMDD) C***CATEGORY NO. D1B10 C***KEYWORDS BLAS,GIVENS ROTATION,LINEAR ALGEBRA,VECTOR C***AUTHOR LAWSON, C. L., (JPL) C HANSON, R. J., (SNLA) C KINCAID, D. R., (U. OF TEXAS) C KROGH, F. T., (JPL) C***PURPOSE CONSTRUCT S.P. PLANE GIVENS ROTATION C***DESCRIPTION C B L A S SUBPROGRAM C DESCRIPTION OF PARAMETERS C --INPUT-- C SA SINGLE PRECISION SCALAR C SB SINGLE PRECISION SCALAR C --OUTPUT-- C SA SINGLE PRECISION RESULT R C SB SINGLE PRECISION RESULT Z C SC SINGLE PRECISION RESULT C SS SINGLE PRECISION RESULT C DESIGNED BY C. L. LAWSON, JPL, 1977 SEPT 08 C CONSTRUCT THE GIVENS TRANSFORMATION C ( SC SS ) C G = ( ) , SC**2 + SS**2 = 1 , C (-SS SC ) C WHICH ZEROS THE SECOND ENTRY OF THE 2-VECTOR (SA,SB)**T. C THE QUANTITY R = (+/-)SQRT(SA**2 + SB**2) OVERWRITES SA IN C STORAGE. THE VALUE OF SB IS OVERWRITTEN BY A VALUE Z WHICH C ALLOWS SC AND SS TO BE RECOVERED BY THE FOLLOWING ALGORITHM@D C IF Z=1 SET SC=0. AND SS=1. C IF ABS(Z) .LT. 1 SET SC=SQRT(1-Z**2) AND SS=Z C IF ABS(Z) .GT. 1 SET SC=1/Z AND SS=SQRT(1-SC**2) C NORMALLY, THE SUBPROGRAM SROT(N,SX,INCX,SY,INCY,SC,SS) WILL C NEXT BE CALLED TO APPLY THE TRANSFORMATION TO A 2 BY N MATRIX. C***REFERENCES LAWSON C.L., HANSON R.J., KINCAID D.R., KROGH F.T., C *BASIC LINEAR ALGEBRA SUBPROGRAMS FOR FORTRAN USAGE*, C ALGORITHM NO. 539, TRANSACTIONS ON MATHEMATICAL C SOFTWARE, VOLUME 5, NUMBER 3, SEPTEMBER 1979, 308-323 C***ROUTINES CALLED (NONE) C***END PROLOGUE SROTG C...SCALAR ARGUMENTS REAL SA,SB,SC,SS C...LOCAL SCALARS REAL R,U,V C...INTRINSIC FUNCTIONS INTRINSIC + ABS,SQRT C***FIRST EXECUTABLE STATEMENT SROTG IF (ABS(SA) .LE. ABS(SB)) GO TO 10 C *** HERE ABS(SA) .GT. ABS(SB) *** U = SA + SA V = SB / U C NOTE THAT U AND R HAVE THE SIGN OF SA R = SQRT(.25 + V**2) * U C NOTE THAT SC IS POSITIVE SC = SA / R SS = V * (SC + SC) SB = SS SA = R RETURN C *** HERE ABS(SA) .LE. ABS(SB) *** 10 IF (SB .EQ. 0.) GO TO 20 U = SB + SB V = SA / U C NOTE THAT U AND R HAVE THE SIGN OF SB C (R IS IMMEDIATELY STORED IN SA) SA = SQRT(.25 + V**2) * U C NOTE THAT SS IS POSITIVE SS = SB / SA SC = V * (SS + SS) IF (SC .EQ. 0.) GO TO 15 SB = 1. / SC RETURN 15 SB = 1. RETURN C *** HERE SA = SB = 0. *** 20 SC = 1. SS = 0. RETURN END *SSCAL SUBROUTINE SSCAL(N,SA,SX,INCX) C***BEGIN PROLOGUE SSCAL C***DATE WRITTEN 791001 (YYMMDD) C***REVISION DATE 820801 (YYMMDD) C***CATEGORY NO. D1A6 C***KEYWORDS BLAS,LINEAR ALGEBRA,SCALE,VECTOR C***AUTHOR LAWSON, C. L., (JPL) C HANSON, R. J., (SNLA) C KINCAID, D. R., (U. OF TEXAS) C KROGH, F. T., (JPL) C***PURPOSE S.P. VECTOR SCALE X = A*X C***DESCRIPTION C B L A S SUBPROGRAM C DESCRIPTION OF PARAMETERS C --INPUT-- C N NUMBER OF ELEMENTS IN INPUT VECTOR(S) C SA SINGLE PRECISION SCALE FACTOR C SX SINGLE PRECISION VECTOR WITH N ELEMENTS C INCX STORAGE SPACING BETWEEN ELEMENTS OF SX C --OUTPUT-- C SX SINGLE PRECISION RESULT (UNCHANGED IF N .LE. 0) C REPLACE SINGLE PRECISION SX BY SINGLE PRECISION SA*SX. C FOR I = 0 TO N-1, REPLACE SX(1+I*INCX) WITH SA * SX(1+I*INCX) C***REFERENCES LAWSON C.L., HANSON R.J., KINCAID D.R., KROGH F.T., C *BASIC LINEAR ALGEBRA SUBPROGRAMS FOR FORTRAN USAGE*, C ALGORITHM NO. 539, TRANSACTIONS ON MATHEMATICAL C SOFTWARE, VOLUME 5, NUMBER 3, SEPTEMBER 1979, 308-323 C***ROUTINES CALLED (NONE) C***END PROLOGUE SSCAL C...SCALAR ARGUMENTS REAL SA INTEGER + INCX,N C...ARRAY ARGUMENTS REAL SX(*) C...LOCAL SCALARS INTEGER + I,M,MP1,NS C...INTRINSIC FUNCTIONS INTRINSIC + MOD C***FIRST EXECUTABLE STATEMENT SSCAL IF(N.LE.0)RETURN IF(INCX.EQ.1)GOTO 20 C CODE FOR INCREMENTS NOT EQUAL TO 1. NS = N*INCX DO 10 I = 1,NS,INCX SX(I) = SA*SX(I) 10 CONTINUE RETURN C CODE FOR INCREMENTS EQUAL TO 1. C CLEAN-UP LOOP SO REMAINING VECTOR LENGTH IS A MULTIPLE OF 5. 20 M = MOD(N,5) IF( M .EQ. 0 ) GO TO 40 DO 30 I = 1,M SX(I) = SA*SX(I) 30 CONTINUE IF( N .LT. 5 ) RETURN 40 MP1 = M + 1 DO 50 I = MP1,N,5 SX(I) = SA*SX(I) SX(I + 1) = SA*SX(I + 1) SX(I + 2) = SA*SX(I + 2) SX(I + 3) = SA*SX(I + 3) SX(I + 4) = SA*SX(I + 4) 50 CONTINUE RETURN END *SSWAP SUBROUTINE SSWAP(N,SX,INCX,SY,INCY) C***BEGIN PROLOGUE SSWAP C***DATE WRITTEN 791001 (YYMMDD) C***REVISION DATE 820801 (YYMMDD) C***CATEGORY NO. D1A5 C***KEYWORDS BLAS,INTERCHANGE,LINEAR ALGEBRA,VECTOR C***AUTHOR LAWSON, C. L., (JPL) C HANSON, R. J., (SNLA) C KINCAID, D. R., (U. OF TEXAS) C KROGH, F. T., (JPL) C***PURPOSE INTERCHANGE S.P VECTORS C***DESCRIPTION C B L A S SUBPROGRAM C DESCRIPTION OF PARAMETERS C --INPUT-- C N NUMBER OF ELEMENTS IN INPUT VECTOR(S) C SX SINGLE PRECISION VECTOR WITH N ELEMENTS C INCX STORAGE SPACING BETWEEN ELEMENTS OF SX C SY SINGLE PRECISION VECTOR WITH N ELEMENTS C INCY STORAGE SPACING BETWEEN ELEMENTS OF SY C --OUTPUT-- C SX INPUT VECTOR SY (UNCHANGED IF N .LE. 0) C SY INPUT VECTOR SX (UNCHANGED IF N .LE. 0) C INTERCHANGE SINGLE PRECISION SX AND SINGLE PRECISION SY. C FOR I = 0 TO N-1, INTERCHANGE SX(LX+I*INCX) AND SY(LY+I*INCY), C WHERE LX = 1 IF INCX .GE. 0, ELSE LX = (-INCX)*N, AND LY IS C DEFINED IN A SIMILAR WAY USING INCY. C***REFERENCES LAWSON C.L., HANSON R.J., KINCAID D.R., KROGH F.T., C *BASIC LINEAR ALGEBRA SUBPROGRAMS FOR FORTRAN USAGE*, C ALGORITHM NO. 539, TRANSACTIONS ON MATHEMATICAL C SOFTWARE, VOLUME 5, NUMBER 3, SEPTEMBER 1979, 308-323 C***ROUTINES CALLED (NONE) C***END PROLOGUE SSWAP C...SCALAR ARGUMENTS INTEGER + INCX,INCY,N C...ARRAY ARGUMENTS REAL SX(*),SY(*) C...LOCAL SCALARS REAL STEMP1,STEMP2,STEMP3 INTEGER + I,IX,IY,M,MP1,NS C...INTRINSIC FUNCTIONS INTRINSIC + MOD C***FIRST EXECUTABLE STATEMENT SSWAP IF(N.LE.0)RETURN IF(INCX.EQ.INCY) IF(INCX-1) 5,20,60 5 CONTINUE C CODE FOR UNEQUAL OR NONPOSITIVE INCREMENTS. IX = 1 IY = 1 IF(INCX.LT.0)IX = (-N+1)*INCX + 1 IF(INCY.LT.0)IY = (-N+1)*INCY + 1 DO 10 I = 1,N STEMP1 = SX(IX) SX(IX) = SY(IY) SY(IY) = STEMP1 IX = IX + INCX IY = IY + INCY 10 CONTINUE RETURN C CODE FOR BOTH INCREMENTS EQUAL TO 1 C CLEAN-UP LOOP SO REMAINING VECTOR LENGTH IS A MULTIPLE OF 3. 20 M = MOD(N,3) IF( M .EQ. 0 ) GO TO 40 DO 30 I = 1,M STEMP1 = SX(I) SX(I) = SY(I) SY(I) = STEMP1 30 CONTINUE IF( N .LT. 3 ) RETURN 40 MP1 = M + 1 DO 50 I = MP1,N,3 STEMP1 = SX(I) STEMP2 = SX(I+1) STEMP3 = SX(I+2) SX(I) = SY(I) SX(I+1) = SY(I+1) SX(I+2) = SY(I+2) SY(I) = STEMP1 SY(I+1) = STEMP2 SY(I+2) = STEMP3 50 CONTINUE RETURN 60 CONTINUE C CODE FOR EQUAL, POSITIVE, NONUNIT INCREMENTS. NS = N*INCX DO 70 I=1,NS,INCX STEMP1 = SX(I) SX(I) = SY(I) SY(I) = STEMP1 70 CONTINUE RETURN END *STRCO SUBROUTINE STRCO(T,LDT,N,RCOND,Z,JOB) C***BEGIN PROLOGUE STRCO C***DATE WRITTEN 780814 (YYMMDD) C***REVISION DATE 820801 (YYMMDD) C***CATEGORY NO. D2A3 C***KEYWORDS CONDITION,FACTOR,LINEAR ALGEBRA,LINPACK,MATRIX,TRIANGULAR C***AUTHOR MOLER, C. B., (U. OF NEW MEXICO) C***PURPOSE ESTIMATES THE CONDITION OF A REAL TRIANGULAR MATRIX. C***DESCRIPTION C STRCO ESTIMATES THE CONDITION OF A REAL TRIANGULAR MATRIX. C ON ENTRY C T REAL(LDT,N) C T CONTAINS THE TRIANGULAR MATRIX. THE ZERO C ELEMENTS OF THE MATRIX ARE NOT REFERENCED, AND C THE CORRESPONDING ELEMENTS OF THE ARRAY CAN BE C USED TO STORE OTHER INFORMATION. C LDT INTEGER C LDT IS THE LEADING DIMENSION OF THE ARRAY T. C N INTEGER C N IS THE ORDER OF THE SYSTEM. C JOB INTEGER C = 0 T IS LOWER TRIANGULAR. C = NONZERO T IS UPPER TRIANGULAR. C ON RETURN C RCOND REAL C AN ESTIMATE OF THE RECIPROCAL CONDITION OF T . C FOR THE SYSTEM T*X = B , RELATIVE PERTURBATIONS C IN T AND B OF SIZE EPSILON MAY CAUSE C RELATIVE PERTURBATIONS IN X OF SIZE EPSILON/RCOND . C IF RCOND IS SO SMALL THAT THE LOGICAL EXPRESSION C 1.0 + RCOND .EQ. 1.0 C IS TRUE, THEN T MAY BE SINGULAR TO WORKING C PRECISION. IN PARTICULAR, RCOND IS ZERO IF C EXACT SINGULARITY IS DETECTED OR THE ESTIMATE C UNDERFLOWS. C Z REAL(N) C A WORK VECTOR WHOSE CONTENTS ARE USUALLY UNIMPORTANT. C IF T IS CLOSE TO A SINGULAR MATRIX, THEN Z IS C AN APPROXIMATE NULL VECTOR IN THE SENSE THAT C NORM(A*Z) = RCOND*NORM(A)*NORM(Z) . C LINPACK. THIS VERSION DATED 08/14/78 . C CLEVE MOLER, UNIVERSITY OF NEW MEXICO, ARGONNE NATIONAL LAB. C***REFERENCES DONGARRA J.J., BUNCH J.R., MOLER C.B., STEWART G.W., C *LINPACK USERS GUIDE*, SIAM, 1979. C***ROUTINES CALLED SASUM,SAXPY,SSCAL C***END PROLOGUE STRCO C...SCALAR ARGUMENTS REAL RCOND INTEGER + JOB,LDT,N C...ARRAY ARGUMENTS REAL T(LDT,*),Z(*) C...LOCAL SCALARS REAL EK,S,SM,TNORM,W,WK,WKM,YNORM INTEGER + I1,J,J1,J2,K,KK,L LOGICAL + LOWER C...EXTERNAL FUNCTIONS REAL SASUM EXTERNAL + SASUM C...EXTERNAL SUBROUTINES EXTERNAL + SAXPY,SSCAL C...INTRINSIC FUNCTIONS INTRINSIC + ABS,AMAX1,SIGN C***FIRST EXECUTABLE STATEMENT STRCO LOWER = JOB .EQ. 0 C COMPUTE 1-NORM OF T TNORM = 0.0E0 DO 10 J = 1, N L = J IF (LOWER) L = N + 1 - J I1 = 1 IF (LOWER) I1 = J TNORM = AMAX1(TNORM,SASUM(L,T(I1,J),1)) 10 CONTINUE C RCOND = 1/(NORM(T)*(ESTIMATE OF NORM(INVERSE(T)))) . C ESTIMATE = NORM(Z)/NORM(Y) WHERE T*Z = Y AND TRANS(T)*Y = E . C TRANS(T) IS THE TRANSPOSE OF T . C THE COMPONENTS OF E ARE CHOSEN TO CAUSE MAXIMUM LOCAL C GROWTH IN THE ELEMENTS OF Y . C THE VECTORS ARE FREQUENTLY RESCALED TO AVOID OVERFLOW. C SOLVE TRANS(T)*Y = E EK = 1.0E0 DO 20 J = 1, N Z(J) = 0.0E0 20 CONTINUE DO 100 KK = 1, N K = KK IF (LOWER) K = N + 1 - KK IF (Z(K) .NE. 0.0E0) EK = SIGN(EK,-Z(K)) IF (ABS(EK-Z(K)) .LE. ABS(T(K,K))) GO TO 30 S = ABS(T(K,K))/ABS(EK-Z(K)) CALL SSCAL(N,S,Z,1) EK = S*EK 30 CONTINUE WK = EK - Z(K) WKM = -EK - Z(K) S = ABS(WK) SM = ABS(WKM) IF (T(K,K) .EQ. 0.0E0) GO TO 40 WK = WK/T(K,K) WKM = WKM/T(K,K) GO TO 50 40 CONTINUE WK = 1.0E0 WKM = 1.0E0 50 CONTINUE IF (KK .EQ. N) GO TO 90 J1 = K + 1 IF (LOWER) J1 = 1 J2 = N IF (LOWER) J2 = K - 1 DO 60 J = J1, J2 SM = SM + ABS(Z(J)+WKM*T(K,J)) Z(J) = Z(J) + WK*T(K,J) S = S + ABS(Z(J)) 60 CONTINUE IF (S .GE. SM) GO TO 80 W = WKM - WK WK = WKM DO 70 J = J1, J2 Z(J) = Z(J) + W*T(K,J) 70 CONTINUE 80 CONTINUE 90 CONTINUE Z(K) = WK 100 CONTINUE S = 1.0E0/SASUM(N,Z,1) CALL SSCAL(N,S,Z,1) YNORM = 1.0E0 C SOLVE T*Z = Y DO 130 KK = 1, N K = N + 1 - KK IF (LOWER) K = KK IF (ABS(Z(K)) .LE. ABS(T(K,K))) GO TO 110 S = ABS(T(K,K))/ABS(Z(K)) CALL SSCAL(N,S,Z,1) YNORM = S*YNORM 110 CONTINUE IF (T(K,K) .NE. 0.0E0) Z(K) = Z(K)/T(K,K) IF (T(K,K) .EQ. 0.0E0) Z(K) = 1.0E0 I1 = 1 IF (LOWER) I1 = K + 1 IF (KK .GE. N) GO TO 120 W = -Z(K) CALL SAXPY(N-KK,W,T(I1,K),1,Z(I1),1) 120 CONTINUE 130 CONTINUE C MAKE ZNORM = 1.0 S = 1.0E0/SASUM(N,Z,1) CALL SSCAL(N,S,Z,1) YNORM = S*YNORM IF (TNORM .NE. 0.0E0) RCOND = YNORM/TNORM IF (TNORM .EQ. 0.0E0) RCOND = 0.0E0 RETURN END *STRSL SUBROUTINE STRSL(T,LDT,N,B,JOB,INFO) C***BEGIN PROLOGUE STRSL C***DATE WRITTEN 780814 (YYMMDD) C***REVISION DATE 820801 (YYMMDD) C***CATEGORY NO. D2A3 C***KEYWORDS LINEAR ALGEBRA,LINPACK,MATRIX,SOLVE,TRIANGULAR C***AUTHOR STEWART, G. W., (U. OF MARYLAND) C***PURPOSE SOLVES SYSTEMS OF THE FORM T*X=B OR TRANS(T)*X=B C WHERE T IS A TRIANGULAR MATRIX OF ORDER N. C***DESCRIPTION C STRSL SOLVES SYSTEMS OF THE FORM C T * X = B C OR C TRANS(T) * X = B C WHERE T IS A TRIANGULAR MATRIX OF ORDER N. HERE TRANS(T) C DENOTES THE TRANSPOSE OF THE MATRIX T. C ON ENTRY C T REAL(LDT,N) C T CONTAINS THE MATRIX OF THE SYSTEM. THE ZERO C ELEMENTS OF THE MATRIX ARE NOT REFERENCED, AND C THE CORRESPONDING ELEMENTS OF THE ARRAY CAN BE C USED TO STORE OTHER INFORMATION. C LDT INTEGER C LDT IS THE LEADING DIMENSION OF THE ARRAY T. C N INTEGER C N IS THE ORDER OF THE SYSTEM. C B REAL(N). C B CONTAINS THE RIGHT HAND SIDE OF THE SYSTEM. C JOB INTEGER C JOB SPECIFIES WHAT KIND OF SYSTEM IS TO BE SOLVED. C IF JOB IS C 00 SOLVE T*X=B, T LOWER TRIANGULAR, C 01 SOLVE T*X=B, T UPPER TRIANGULAR, C 10 SOLVE TRANS(T)*X=B, T LOWER TRIANGULAR, C 11 SOLVE TRANS(T)*X=B, T UPPER TRIANGULAR. C ON RETURN C B B CONTAINS THE SOLUTION, IF INFO .EQ. 0. C OTHERWISE B IS UNALTERED. C INFO INTEGER C INFO CONTAINS ZERO IF THE SYSTEM IS NONSINGULAR. C OTHERWISE INFO CONTAINS THE INDEX OF C THE FIRST ZERO DIAGONAL ELEMENT OF T. C LINPACK. THIS VERSION DATED 08/14/78 . C G. W. STEWART, UNIVERSITY OF MARYLAND, ARGONNE NATIONAL LAB. C***REFERENCES DONGARRA J.J., BUNCH J.R., MOLER C.B., STEWART G.W., C *LINPACK USERS GUIDE*, SIAM, 1979. C***ROUTINES CALLED SAXPY,SDOT C***END PROLOGUE STRSL C...SCALAR ARGUMENTS INTEGER + INFO,JOB,LDT,N C...ARRAY ARGUMENTS REAL B(*),T(LDT,*) C...LOCAL SCALARS REAL TEMP INTEGER + CASE,J,JJ C...EXTERNAL FUNCTIONS REAL SDOT EXTERNAL + SDOT C...EXTERNAL SUBROUTINES EXTERNAL + SAXPY C...INTRINSIC FUNCTIONS INTRINSIC + MOD C***FIRST EXECUTABLE STATEMENT STRSL C BEGIN BLOCK PERMITTING ...EXITS TO 150 C CHECK FOR ZERO DIAGONAL ELEMENTS. DO 10 INFO = 1, N C ......EXIT IF (T(INFO,INFO) .EQ. 0.0E0) GO TO 150 10 CONTINUE INFO = 0 C DETERMINE THE TASK AND GO TO IT. CASE = 1 IF (MOD(JOB,10) .NE. 0) CASE = 2 IF (MOD(JOB,100)/10 .NE. 0) CASE = CASE + 2 GO TO (20,50,80,110), CASE C SOLVE T*X=B FOR T LOWER TRIANGULAR 20 CONTINUE B(1) = B(1)/T(1,1) IF (N .LT. 2) GO TO 40 DO 30 J = 2, N TEMP = -B(J-1) CALL SAXPY(N-J+1,TEMP,T(J,J-1),1,B(J),1) B(J) = B(J)/T(J,J) 30 CONTINUE 40 CONTINUE GO TO 140 C SOLVE T*X=B FOR T UPPER TRIANGULAR. 50 CONTINUE B(N) = B(N)/T(N,N) IF (N .LT. 2) GO TO 70 DO 60 JJ = 2, N J = N - JJ + 1 TEMP = -B(J+1) CALL SAXPY(J,TEMP,T(1,J+1),1,B(1),1) B(J) = B(J)/T(J,J) 60 CONTINUE 70 CONTINUE GO TO 140 C SOLVE TRANS(T)*X=B FOR T LOWER TRIANGULAR. 80 CONTINUE B(N) = B(N)/T(N,N) IF (N .LT. 2) GO TO 100 DO 90 JJ = 2, N J = N - JJ + 1 B(J) = B(J) - SDOT(JJ-1,T(J+1,J),1,B(J+1),1) B(J) = B(J)/T(J,J) 90 CONTINUE 100 CONTINUE GO TO 140 C SOLVE TRANS(T)*X=B FOR T UPPER TRIANGULAR. 110 CONTINUE B(1) = B(1)/T(1,1) IF (N .LT. 2) GO TO 130 DO 120 J = 2, N B(J) = B(J) - SDOT(J-1,T(1,J),1,B(1),1) B(J) = B(J)/T(J,J) 120 CONTINUE 130 CONTINUE 140 CONTINUE 150 CONTINUE RETURN END .