--- /dev/null
+C 10 NOV 94 - MWS - DNRM2: REMOVE FTNCHECK WARNINGS
+C 11 JUN 94 - MWS - INCLUDE A COPY OF DGEMV (LEVEL TWO ROUTINE)
+C 11 AUG 87 - MWS - SANITIZE FLOATING POINT CONSTANTS IN DNRM2
+C 26 MAR 87 - MWS - USE GENERIC SIGN IN DROTG
+C 28 NOV 86 - STE - SUPPLY ALL LEVEL ONE BLAS
+C 7 JUL 86 - JAB - SANITIZE FLOATING POINT CONSTANTS
+C
+C BASIC LINEAR ALGEBRA SUBPROGRAMS (BLAS) FROM LINPACK (LEVEL 1)
+C
+C THIS MODULE SHOULD BE COMPILED ONLY IF SPECIALLY CODED
+C VERSIONS OF THESE ROUTINES ARE NOT AVAILABLE ON THE TARGET MACHINE
+C
+C*MODULE BLAS1 *DECK DASUM
+ DOUBLE PRECISION FUNCTION DASUM(N,DX,INCX)
+C
+C TAKES THE SUM OF THE ABSOLUTE VALUES.
+C JACK DONGARRA, LINPACK, 3/11/78.
+C
+ DOUBLE PRECISION DX(1),DTEMP
+ INTEGER I,INCX,M,MP1,N,NINCX
+C
+ DASUM = 0.0D+00
+ DTEMP = 0.0D+00
+ IF(N.LE.0)RETURN
+ IF(INCX.EQ.1)GO TO 20
+C
+C CODE FOR INCREMENT NOT EQUAL TO 1
+C
+ NINCX = N*INCX
+ DO 10 I = 1,NINCX,INCX
+ DTEMP = DTEMP + ABS(DX(I))
+ 10 CONTINUE
+ DASUM = DTEMP
+ RETURN
+C
+C CODE FOR INCREMENT EQUAL TO 1
+C
+C
+C CLEAN-UP LOOP
+C
+ 20 M = MOD(N,6)
+ IF( M .EQ. 0 ) GO TO 40
+ DO 30 I = 1,M
+ DTEMP = DTEMP + ABS(DX(I))
+ 30 CONTINUE
+ IF( N .LT. 6 ) GO TO 60
+ 40 MP1 = M + 1
+ DO 50 I = MP1,N,6
+ DTEMP = DTEMP + ABS(DX(I)) + ABS(DX(I + 1)) + ABS(DX(I + 2))
+ * + ABS(DX(I + 3)) + ABS(DX(I + 4)) + ABS(DX(I + 5))
+ 50 CONTINUE
+ 60 DASUM = DTEMP
+ RETURN
+ END
+C*MODULE BLAS1 *DECK DAXPY
+ SUBROUTINE DAXPY(N,DA,DX,INCX,DY,INCY)
+ IMPLICIT DOUBLE PRECISION(A-H,O-Z)
+ DIMENSION DX(1),DY(1)
+C
+C CONSTANT TIMES A VECTOR PLUS A VECTOR.
+C DY(I) = DY(I) + DA * DX(I)
+C USES UNROLLED LOOPS FOR INCREMENTS EQUAL TO ONE.
+C JACK DONGARRA, LINPACK, 3/11/78.
+C
+ IF(N.LE.0)RETURN
+ IF (DA .EQ. 0.0D+00) RETURN
+ IF(INCX.EQ.1.AND.INCY.EQ.1)GO TO 20
+C
+C CODE FOR UNEQUAL INCREMENTS OR EQUAL INCREMENTS
+C NOT EQUAL TO 1
+C
+ 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
+ DY(IY) = DY(IY) + DA*DX(IX)
+ IX = IX + INCX
+ IY = IY + INCY
+ 10 CONTINUE
+ RETURN
+C
+C CODE FOR BOTH INCREMENTS EQUAL TO 1
+C
+C
+C CLEAN-UP LOOP
+C
+ 20 M = MOD(N,4)
+ IF( M .EQ. 0 ) GO TO 40
+ DO 30 I = 1,M
+ DY(I) = DY(I) + DA*DX(I)
+ 30 CONTINUE
+ IF( N .LT. 4 ) RETURN
+ 40 MP1 = M + 1
+ DO 50 I = MP1,N,4
+ DY(I) = DY(I) + DA*DX(I)
+ DY(I + 1) = DY(I + 1) + DA*DX(I + 1)
+ DY(I + 2) = DY(I + 2) + DA*DX(I + 2)
+ DY(I + 3) = DY(I + 3) + DA*DX(I + 3)
+ 50 CONTINUE
+ RETURN
+ END
+C*MODULE BLAS1 *DECK DCOPY
+ SUBROUTINE DCOPY(N,DX,INCX,DY,INCY)
+ IMPLICIT DOUBLE PRECISION(A-H,O-Z)
+ DIMENSION DX(*),DY(*)
+C
+C COPIES A VECTOR.
+C DY(I) <== DX(I)
+C USES UNROLLED LOOPS FOR INCREMENTS EQUAL TO ONE.
+C JACK DONGARRA, LINPACK, 3/11/78.
+C
+ IF(N.LE.0)RETURN
+ IF(INCX.EQ.1.AND.INCY.EQ.1)GO TO 20
+C
+C CODE FOR UNEQUAL INCREMENTS OR EQUAL INCREMENTS
+C NOT EQUAL TO 1
+C
+ 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
+ DY(IY) = DX(IX)
+ IX = IX + INCX
+ IY = IY + INCY
+ 10 CONTINUE
+ RETURN
+C
+C CODE FOR BOTH INCREMENTS EQUAL TO 1
+C
+C
+C CLEAN-UP LOOP
+C
+ 20 M = MOD(N,7)
+ IF( M .EQ. 0 ) GO TO 40
+ DO 30 I = 1,M
+ DY(I) = DX(I)
+ 30 CONTINUE
+ IF( N .LT. 7 ) RETURN
+ 40 MP1 = M + 1
+ DO 50 I = MP1,N,7
+ DY(I) = DX(I)
+ DY(I + 1) = DX(I + 1)
+ DY(I + 2) = DX(I + 2)
+ DY(I + 3) = DX(I + 3)
+ DY(I + 4) = DX(I + 4)
+ DY(I + 5) = DX(I + 5)
+ DY(I + 6) = DX(I + 6)
+ 50 CONTINUE
+ RETURN
+ END
+C*MODULE BLAS1 *DECK DDOT
+ DOUBLE PRECISION FUNCTION DDOT(N,DX,INCX,DY,INCY)
+ IMPLICIT DOUBLE PRECISION(A-H,O-Z)
+ DIMENSION DX(1),DY(1)
+C
+C FORMS THE DOT PRODUCT OF TWO VECTORS.
+C DOT = DX(I) * DY(I)
+C USES UNROLLED LOOPS FOR INCREMENTS EQUAL TO ONE.
+C JACK DONGARRA, LINPACK, 3/11/78.
+C
+ DDOT = 0.0D+00
+ DTEMP = 0.0D+00
+ IF(N.LE.0)RETURN
+ IF(INCX.EQ.1.AND.INCY.EQ.1)GO TO 20
+C
+C CODE FOR UNEQUAL INCREMENTS OR EQUAL INCREMENTS
+C NOT EQUAL TO 1
+C
+ 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
+ DTEMP = DTEMP + DX(IX)*DY(IY)
+ IX = IX + INCX
+ IY = IY + INCY
+ 10 CONTINUE
+ DDOT = DTEMP
+ RETURN
+C
+C CODE FOR BOTH INCREMENTS EQUAL TO 1
+C
+C
+C CLEAN-UP LOOP
+C
+ 20 M = MOD(N,5)
+ IF( M .EQ. 0 ) GO TO 40
+ DO 30 I = 1,M
+ DTEMP = DTEMP + DX(I)*DY(I)
+ 30 CONTINUE
+ IF( N .LT. 5 ) GO TO 60
+ 40 MP1 = M + 1
+ DO 50 I = MP1,N,5
+ DTEMP = DTEMP + DX(I)*DY(I) + DX(I + 1)*DY(I + 1) +
+ * DX(I + 2)*DY(I + 2) + DX(I + 3)*DY(I + 3) + DX(I + 4)*DY(I + 4)
+ 50 CONTINUE
+ 60 DDOT = DTEMP
+ RETURN
+ END
+C*MODULE BLAS1 *DECK DNRM2
+ DOUBLE PRECISION FUNCTION DNRM2 ( N, DX, INCX)
+ INTEGER NEXT
+ DOUBLE PRECISION DX(1), CUTLO, CUTHI, HITEST, SUM, XMAX,ZERO,ONE
+ DATA ZERO, ONE /0.0D+00, 1.0D+00/
+C
+C EUCLIDEAN NORM OF THE N-VECTOR STORED IN DX() 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 C.L.LAWSON, 1978 JAN 08
+C
+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
+C BRIEF OUTLINE OF ALGORITHM..
+C
+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
+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.30438D+19
+C DATA CUTLO, CUTHI / 8.232D-11, 1.304D+19 /
+C DATA CUTLO, CUTHI / 4.441E-16, 1.304E19 /
+ DATA CUTLO, CUTHI / 8.232D-11, 1.304D+19 /
+C
+ J=0
+ IF(N .GT. 0) GO TO 10
+ DNRM2 = ZERO
+ GO TO 300
+C
+ 10 ASSIGN 30 TO NEXT
+ SUM = ZERO
+ NN = N * INCX
+C BEGIN MAIN LOOP
+ I = 1
+ 20 GO TO NEXT,(30, 50, 70, 110)
+ 30 IF( ABS(DX(I)) .GT. CUTLO) GO TO 85
+ ASSIGN 50 TO NEXT
+ XMAX = ZERO
+C
+C PHASE 1. SUM IS ZERO
+C
+ 50 IF( DX(I) .EQ. ZERO) GO TO 200
+ IF( ABS(DX(I)) .GT. CUTLO) GO TO 85
+C
+C PREPARE FOR PHASE 2.
+ ASSIGN 70 TO NEXT
+ GO TO 105
+C
+C PREPARE FOR PHASE 4.
+C
+ 100 I = J
+ ASSIGN 110 TO NEXT
+ SUM = (SUM / DX(I)) / DX(I)
+ 105 XMAX = ABS(DX(I))
+ GO TO 115
+C
+C PHASE 2. SUM IS SMALL.
+C SCALE TO AVOID DESTRUCTIVE UNDERFLOW.
+C
+ 70 IF( ABS(DX(I)) .GT. CUTLO ) GO TO 75
+C
+C COMMON CODE FOR PHASES 2 AND 4.
+C IN PHASE 4 SUM IS LARGE. SCALE TO AVOID OVERFLOW.
+C
+ 110 IF( ABS(DX(I)) .LE. XMAX ) GO TO 115
+ SUM = ONE + SUM * (XMAX / DX(I))**2
+ XMAX = ABS(DX(I))
+ GO TO 200
+C
+ 115 SUM = SUM + (DX(I)/XMAX)**2
+ GO TO 200
+C
+C
+C PREPARE FOR PHASE 3.
+C
+ 75 SUM = (SUM * XMAX) * XMAX
+C
+C
+C FOR REAL OR D.P. SET HITEST = CUTHI/N
+C FOR COMPLEX SET HITEST = CUTHI/(2*N)
+C
+ 85 HITEST = CUTHI/N
+C
+C PHASE 3. SUM IS MID-RANGE. NO SCALING.
+C
+ DO 95 J =I,NN,INCX
+ IF(ABS(DX(J)) .GE. HITEST) GO TO 100
+ 95 SUM = SUM + DX(J)**2
+ DNRM2 = SQRT( SUM )
+ GO TO 300
+C
+ 200 CONTINUE
+ I = I + INCX
+ IF ( I .LE. NN ) GO TO 20
+C
+C END OF MAIN LOOP.
+C
+C COMPUTE SQUARE ROOT AND ADJUST FOR SCALING.
+C
+ DNRM2 = XMAX * SQRT(SUM)
+ 300 CONTINUE
+ RETURN
+ END
+C*MODULE BLAS1 *DECK DROT
+ SUBROUTINE DROT (N,DX,INCX,DY,INCY,C,S)
+ IMPLICIT DOUBLE PRECISION(A-H,O-Z)
+ DIMENSION DX(1),DY(1)
+C
+C APPLIES A PLANE ROTATION.
+C DX(I) = C*DX(I) + S*DY(I)
+C DY(I) = -S*DX(I) + C*DY(I)
+C JACK DONGARRA, LINPACK, 3/11/78.
+C
+ IF(N.LE.0)RETURN
+ IF(INCX.EQ.1.AND.INCY.EQ.1)GO TO 20
+C
+C CODE FOR UNEQUAL INCREMENTS OR EQUAL INCREMENTS NOT EQUAL
+C TO 1
+C
+ 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
+ DTEMP = C*DX(IX) + S*DY(IY)
+ DY(IY) = C*DY(IY) - S*DX(IX)
+ DX(IX) = DTEMP
+ IX = IX + INCX
+ IY = IY + INCY
+ 10 CONTINUE
+ RETURN
+C
+C CODE FOR BOTH INCREMENTS EQUAL TO 1
+C
+ 20 DO 30 I = 1,N
+ DTEMP = C*DX(I) + S*DY(I)
+ DY(I) = C*DY(I) - S*DX(I)
+ DX(I) = DTEMP
+ 30 CONTINUE
+ RETURN
+ END
+C*MODULE BLAS1 *DECK DROTG
+ SUBROUTINE DROTG(DA,DB,C,S)
+C
+C CONSTRUCT GIVENS PLANE ROTATION.
+C JACK DONGARRA, LINPACK, 3/11/78.
+C
+ DOUBLE PRECISION DA,DB,C,S,ROE,SCALE,R,Z
+ DOUBLE PRECISION ZERO, ONE
+C
+ PARAMETER (ZERO=0.0D+00, ONE=1.0D+00)
+C
+C-----------------------------------------------------------------------
+C
+C
+ ROE = DB
+ IF( ABS(DA) .GT. ABS(DB) ) ROE = DA
+ SCALE = ABS(DA) + ABS(DB)
+ IF( SCALE .NE. ZERO ) GO TO 10
+ C = ONE
+ S = ZERO
+ R = ZERO
+ GO TO 20
+C
+ 10 R = SCALE*SQRT((DA/SCALE)**2 + (DB/SCALE)**2)
+ R = SIGN(ONE,ROE)*R
+ C = DA/R
+ S = DB/R
+ 20 Z = ONE
+ IF( ABS(DA) .GT. ABS(DB) ) Z = S
+ IF( ABS(DB) .GE. ABS(DA) .AND. C .NE. ZERO ) Z = ONE/C
+ DA = R
+ DB = Z
+ RETURN
+ END
+C*MODULE BLAS1 *DECK DSCAL
+ SUBROUTINE DSCAL(N,DA,DX,INCX)
+ IMPLICIT DOUBLE PRECISION(A-H,O-Z)
+ DIMENSION DX(1)
+C
+C SCALES A VECTOR BY A CONSTANT.
+C DX(I) = DA * DX(I)
+C USES UNROLLED LOOPS FOR INCREMENT EQUAL TO ONE.
+C JACK DONGARRA, LINPACK, 3/11/78.
+C
+ IF(N.LE.0)RETURN
+ IF(INCX.EQ.1)GO TO 20
+C
+C CODE FOR INCREMENT NOT EQUAL TO 1
+C
+ NINCX = N*INCX
+ DO 10 I = 1,NINCX,INCX
+ DX(I) = DA*DX(I)
+ 10 CONTINUE
+ RETURN
+C
+C CODE FOR INCREMENT EQUAL TO 1
+C
+C
+C CLEAN-UP LOOP
+C
+ 20 M = MOD(N,5)
+ IF( M .EQ. 0 ) GO TO 40
+ DO 30 I = 1,M
+ DX(I) = DA*DX(I)
+ 30 CONTINUE
+ IF( N .LT. 5 ) RETURN
+ 40 MP1 = M + 1
+ DO 50 I = MP1,N,5
+ DX(I) = DA*DX(I)
+ DX(I + 1) = DA*DX(I + 1)
+ DX(I + 2) = DA*DX(I + 2)
+ DX(I + 3) = DA*DX(I + 3)
+ DX(I + 4) = DA*DX(I + 4)
+ 50 CONTINUE
+ RETURN
+ END
+C*MODULE BLAS1 *DECK DSWAP
+ SUBROUTINE DSWAP (N,DX,INCX,DY,INCY)
+ IMPLICIT DOUBLE PRECISION(A-H,O-Z)
+ DIMENSION DX(1),DY(1)
+C
+C INTERCHANGES TWO VECTORS.
+C DX(I) <==> DY(I)
+C USES UNROLLED LOOPS FOR INCREMENTS EQUAL ONE.
+C JACK DONGARRA, LINPACK, 3/11/78.
+C
+ IF(N.LE.0)RETURN
+ IF(INCX.EQ.1.AND.INCY.EQ.1)GO TO 20
+C
+C CODE FOR UNEQUAL INCREMENTS OR EQUAL INCREMENTS NOT EQUAL
+C TO 1
+C
+ 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
+ DTEMP = DX(IX)
+ DX(IX) = DY(IY)
+ DY(IY) = DTEMP
+ IX = IX + INCX
+ IY = IY + INCY
+ 10 CONTINUE
+ RETURN
+C
+C CODE FOR BOTH INCREMENTS EQUAL TO 1
+C
+C
+C CLEAN-UP LOOP
+C
+ 20 M = MOD(N,3)
+ IF( M .EQ. 0 ) GO TO 40
+ DO 30 I = 1,M
+ DTEMP = DX(I)
+ DX(I) = DY(I)
+ DY(I) = DTEMP
+ 30 CONTINUE
+ IF( N .LT. 3 ) RETURN
+ 40 MP1 = M + 1
+ DO 50 I = MP1,N,3
+ DTEMP = DX(I)
+ DX(I) = DY(I)
+ DY(I) = DTEMP
+ DTEMP = DX(I + 1)
+ DX(I + 1) = DY(I + 1)
+ DY(I + 1) = DTEMP
+ DTEMP = DX(I + 2)
+ DX(I + 2) = DY(I + 2)
+ DY(I + 2) = DTEMP
+ 50 CONTINUE
+ RETURN
+ END
+C*MODULE BLAS1 *DECK IDAMAX
+ INTEGER FUNCTION IDAMAX(N,DX,INCX)
+ IMPLICIT DOUBLE PRECISION(A-H,O-Z)
+ DIMENSION DX(1)
+C
+C FINDS THE INDEX OF ELEMENT HAVING MAX. ABSOLUTE VALUE.
+C JACK DONGARRA, LINPACK, 3/11/78.
+C
+ IDAMAX = 0
+ IF( N .LT. 1 ) RETURN
+ IDAMAX = 1
+ IF(N.EQ.1)RETURN
+ IF(INCX.EQ.1)GO TO 20
+C
+C CODE FOR INCREMENT NOT EQUAL TO 1
+C
+ IX = 1
+ RMAX = ABS(DX(1))
+ IX = IX + INCX
+ DO 10 I = 2,N
+ IF(ABS(DX(IX)).LE.RMAX) GO TO 5
+ IDAMAX = I
+ RMAX = ABS(DX(IX))
+ 5 IX = IX + INCX
+ 10 CONTINUE
+ RETURN
+C
+C CODE FOR INCREMENT EQUAL TO 1
+C
+ 20 RMAX = ABS(DX(1))
+ DO 30 I = 2,N
+ IF(ABS(DX(I)).LE.RMAX) GO TO 30
+ IDAMAX = I
+ RMAX = ABS(DX(I))
+ 30 CONTINUE
+ RETURN
+ END
+C*MODULE BLAS *DECK DGEMV
+ SUBROUTINE DGEMV(FORMA,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)
+ IMPLICIT DOUBLE PRECISION(A-H,O-Z)
+ CHARACTER*1 FORMA
+ DIMENSION A(LDA,*),X(*),Y(*)
+ PARAMETER (ZERO=0.0D+00, ONE=1.0D+00)
+C
+C CLONE OF -DGEMV- WRITTEN BY MIKE SCHMIDT
+C
+ LOCY = 1
+ IF(FORMA.EQ.'T') GO TO 200
+C
+C Y = ALPHA * A * X + BETA * Y
+C
+ IF(ALPHA.EQ.ONE .AND. BETA.EQ.ZERO) THEN
+ DO 110 I=1,M
+ Y(LOCY) = DDOT(N,A(I,1),LDA,X,INCX)
+ LOCY = LOCY+INCY
+ 110 CONTINUE
+ ELSE
+ DO 120 I=1,M
+ Y(LOCY) = ALPHA*DDOT(N,A(I,1),LDA,X,INCX) + BETA*Y(LOCY)
+ LOCY = LOCY+INCY
+ 120 CONTINUE
+ END IF
+ RETURN
+C
+C Y = ALPHA * A-TRANSPOSE * X + BETA * Y
+C
+ 200 CONTINUE
+ IF(ALPHA.EQ.ONE .AND. BETA.EQ.ZERO) THEN
+ DO 210 I=1,N
+ Y(LOCY) = DDOT(M,A(1,I),1,X,INCX)
+ LOCY = LOCY+INCY
+ 210 CONTINUE
+ ELSE
+ DO 220 I=1,N
+ Y(LOCY) = ALPHA*DDOT(M,A(1,I),1,X,INCX) + BETA*Y(LOCY)
+ LOCY = LOCY+INCY
+ 220 CONTINUE
+ END IF
+ RETURN
+ END