📄 matrix.f90
字号:
DO 20 I = 1, P Z = Z*RECBAS IF( Y.LT.ONE )& OLDY = Y Y = SLAMC3( Y, Z ) 20 CONTINUE IF( Y.GE.ONE )& Y = OLDY DO 30 I = 1, EMAX Y = SLAMC3( Y*BETA, ZERO ) 30 CONTINUE RMAX = Y RETURN END!============================================================================ REAL FUNCTION SLAPY2( X, Y ) REAL X, Y REAL ZERO PARAMETER ( ZERO = 0.0E0 ) REAL ONE PARAMETER ( ONE = 1.0E0 ) REAL W, XABS, YABS, Z INTRINSIC ABS, MAX, MIN, SQRT XABS = ABS( X ) YABS = ABS( Y ) W = MAX( XABS, YABS ) Z = MIN( XABS, YABS ) IF( Z.EQ.ZERO ) THEN SLAPY2 = W ELSE SLAPY2 = W*SQRT( ONE+( Z / W )**2 ) END IF RETURN END!============================================================================ SUBROUTINE SLARFG( N, ALPHA, X, INCX, TAU ) INTEGER INCX, N REAL ALPHA, TAU REAL X( * ) REAL ONE, ZERO PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 ) INTEGER J, KNT REAL BETA, RSAFMN, SAFMIN, XNORM REAL SLAMCH, SLAPY2, SNRM2 EXTERNAL SLAMCH, SLAPY2, SNRM2 INTRINSIC ABS, SIGN EXTERNAL SSCAL IF( N.LE.1 ) THEN TAU = ZERO RETURN END IF XNORM = SNRM2( N-1, X, INCX ) IF( XNORM.EQ.ZERO ) THEN TAU = ZERO ELSE BETA = -SIGN( SLAPY2( ALPHA, XNORM ), ALPHA ) SAFMIN = SLAMCH( 'S' ) / SLAMCH( 'E' ) IF( ABS( BETA ).LT.SAFMIN ) THEN RSAFMN = ONE / SAFMIN KNT = 0 10 CONTINUE KNT = KNT + 1 CALL SSCAL( N-1, RSAFMN, X, INCX ) BETA = BETA*RSAFMN ALPHA = ALPHA*RSAFMN IF( ABS( BETA ).LT.SAFMIN )& GO TO 10 XNORM = SNRM2( N-1, X, INCX ) BETA = -SIGN( SLAPY2( ALPHA, XNORM ), ALPHA ) TAU = ( BETA-ALPHA ) / BETA CALL SSCAL( N-1, ONE / ( ALPHA-BETA ), X, INCX ) ALPHA = BETA DO 20 J = 1, KNT ALPHA = ALPHA*SAFMIN 20 CONTINUE ELSE TAU = ( BETA-ALPHA ) / BETA CALL SSCAL( N-1, ONE / ( ALPHA-BETA ), X, INCX ) ALPHA = BETA END IF END IF RETURN END!============================================================================ SUBROUTINE SLATRD( UPLO, N, NB, A, LDA, E, TAU, W, LDW ) CHARACTER UPLO INTEGER LDA, LDW, N, NB REAL A( LDA, * ), E( * ), TAU( * ), W( LDW, * ) REAL ZERO, ONE, HALF PARAMETER ( ZERO = 0.0E+0, ONE = 1.0E+0, HALF = 0.5E+0 ) INTEGER I, IW REAL ALPHA EXTERNAL SAXPY, SGEMV, SLARFG, SSCAL, SSYMV LOGICAL LSAME REAL SDOT EXTERNAL LSAME, SDOT INTRINSIC MIN IF( N.LE.0 )& RETURN IF( LSAME( UPLO, 'U' ) ) THEN DO 10 I = N, N - NB + 1, -1 IW = I - N + NB IF( I.LT.N ) THEN CALL SGEMV( 'No transpose', I, N-I, -ONE, A( 1, I+1 ),& LDA, W( I, IW+1 ), LDW, ONE, A( 1, I ), 1 ) CALL SGEMV( 'No transpose', I, N-I, -ONE, W( 1, IW+1 ),& LDW, A( I, I+1 ), LDA, ONE, A( 1, I ), 1 ) END IF IF( I.GT.1 ) THEN CALL SLARFG( I-1, A( I-1, I ), A( 1, I ), 1, TAU( I-1 ) ) E( I-1 ) = A( I-1, I ) A( I-1, I ) = ONE CALL SSYMV( 'Upper', I-1, ONE, A, LDA, A( 1, I ), 1,& ZERO, W( 1, IW ), 1 ) IF( I.LT.N ) THEN CALL SGEMV( 'Transpose', I-1, N-I, ONE, W( 1, IW+1 ),& LDW, A( 1, I ), 1, ZERO, W( I+1, IW ), 1 ) CALL SGEMV( 'No transpose', I-1, N-I, -ONE,& A( 1, I+1 ), LDA, W( I+1, IW ), 1, ONE,& W( 1, IW ), 1 ) CALL SGEMV( 'Transpose', I-1, N-I, ONE, A( 1, I+1 ),& LDA, A( 1, I ), 1, ZERO, W( I+1, IW ), 1 ) CALL SGEMV( 'No transpose', I-1, N-I, -ONE,& W( 1, IW+1 ), LDW, W( I+1, IW ), 1, ONE,& W( 1, IW ), 1 ) END IF CALL SSCAL( I-1, TAU( I-1 ), W( 1, IW ), 1 ) ALPHA = -HALF*TAU( I-1 )*SDOT( I-1, W( 1, IW ), 1,& A( 1, I ), 1 ) CALL SAXPY( I-1, ALPHA, A( 1, I ), 1, W( 1, IW ), 1 ) END IF 10 CONTINUE ELSE DO 20 I = 1, NB CALL SGEMV( 'No transpose', N-I+1, I-1, -ONE, A( I, 1 ),& LDA, W( I, 1 ), LDW, ONE, A( I, I ), 1 ) CALL SGEMV( 'No transpose', N-I+1, I-1, -ONE, W( I, 1 ),& LDW, A( I, 1 ), LDA, ONE, A( I, I ), 1 ) IF( I.LT.N ) THEN CALL SLARFG( N-I, A( I+1, I ), A( MIN( I+2, N ), I ), 1,& TAU( I ) ) E( I ) = A( I+1, I ) A( I+1, I ) = ONE CALL SSYMV( 'Lower', N-I, ONE, A( I+1, I+1 ), LDA,& A( I+1, I ), 1, ZERO, W( I+1, I ), 1 ) CALL SGEMV( 'Transpose', N-I, I-1, ONE, W( I+1, 1 ), LDW,& A( I+1, I ), 1, ZERO, W( 1, I ), 1 ) CALL SGEMV( 'No transpose', N-I, I-1, -ONE, A( I+1, 1 ),& LDA, W( 1, I ), 1, ONE, W( I+1, I ), 1 ) CALL SGEMV( 'Transpose', N-I, I-1, ONE, A( I+1, 1 ), LDA,& A( I+1, I ), 1, ZERO, W( 1, I ), 1 ) CALL SGEMV( 'No transpose', N-I, I-1, -ONE, W( I+1, 1 ),& LDW, W( 1, I ), 1, ONE, W( I+1, I ), 1 ) CALL SSCAL( N-I, TAU( I ), W( I+1, I ), 1 ) ALPHA = -HALF*TAU( I )*SDOT( N-I, W( I+1, I ), 1,& A( I+1, I ), 1 ) CALL SAXPY( N-I, ALPHA, A( I+1, I ), 1, W( I+1, I ), 1 ) END IF 20 CONTINUE END IF RETURN END!============================================================================ REAL FUNCTION SNRM2 ( N, X, INCX ) INTEGER INCX, N REAL X( * ) REAL ONE , ZERO PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 ) INTEGER IX REAL ABSXI, NORM, SCALE, SSQ INTRINSIC ABS, SQRT IF( N.LT.1 .OR. INCX.LT.1 )THEN NORM = ZERO ELSE IF( N.EQ.1 )THEN NORM = ABS( X( 1 ) ) ELSE SCALE = ZERO SSQ = ONE DO 10, IX = 1, 1 + ( N - 1 )*INCX, INCX IF( X( IX ).NE.ZERO )THEN ABSXI = ABS( X( IX ) ) IF( SCALE.LT.ABSXI )THEN SSQ = ONE + SSQ*( SCALE/ABSXI )**2 SCALE = ABSXI ELSE SSQ = SSQ + ( ABSXI/SCALE )**2 END IF END IF 10 CONTINUE NORM = SCALE * SQRT( SSQ ) END IF SNRM2 = NORM RETURN END!============================================================================ SUBROUTINE SPTTRF( N, D, E, INFO ) INTEGER INFO, N REAL D( * ), E( * ) REAL ZERO PARAMETER ( ZERO = 0.0E+0 ) INTEGER I, I4 REAL EI EXTERNAL XERBLA INTRINSIC MOD INFO = 0 IF( N.LT.0 ) THEN INFO = -1 CALL XERBLA( 'SPTTRF', -INFO ) RETURN END IF IF( N.EQ.0 )& RETURN I4 = MOD( N-1, 4 ) DO 10 I = 1, I4 IF( D( I ).LE.ZERO ) THEN INFO = I GO TO 30 END IF EI = E( I ) E( I ) = EI / D( I ) D( I+1 ) = D( I+1 ) - E( I )*EI 10 CONTINUE DO 20 I = I4 + 1, N - 4, 4 IF( D( I ).LE.ZERO ) THEN INFO = I GO TO 30 END IF EI = E( I ) E( I ) = EI / D( I ) D( I+1 ) = D( I+1 ) - E( I )*EI IF( D( I+1 ).LE.ZERO ) THEN INFO = I + 1 GO TO 30 END IF EI = E( I+1 ) E( I+1 ) = EI / D( I+1 ) D( I+2 ) = D( I+2 ) - E( I+1 )*EI IF( D( I+2 ).LE.ZERO ) THEN INFO = I + 2 GO TO 30 END IF EI = E( I+2 ) E( I+2 ) = EI / D( I+2 ) D( I+3 ) = D( I+3 ) - E( I+2 )*EI IF( D( I+3 ).LE.ZERO ) THEN INFO = I + 3 GO TO 30 END IF EI = E( I+3 ) E( I+3 ) = EI / D( I+3 ) D( I+4 ) = D( I+4 ) - E( I+3 )*EI 20 CONTINUE IF( D( N ).LE.ZERO )& INFO = N 30 CONTINUE RETURN END!============================================================================ subroutine sscal(n,sa,sx,incx) real sa,sx(*) integer i,incx,m,mp1,n,nincx if( n.le.0 .or. incx.le.0 )return if(incx.eq.1)go to 20 nincx = n*incx do 10 i = 1,nincx,incx sx(i) = sa*sx(i) 10 continue return 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!============================================================================ SUBROUTINE SSTEBZ( RANGE, ORDER, N, VL, VU, IL, IU, ABSTOL, D, E,& M, NSPLIT, W, IBLOCK, ISPLIT, WORK, IWORK,& INFO ) CHARACTER ORDER, RANGE INTEGER IL, INFO, IU, M, N, NSPLIT REAL ABSTOL, VL, VU INTEGER IBLOCK( * ), ISPLIT( * ), IWORK( * ) REAL D( * ), E( * ), W( * ), WORK( * ) COMMON / LATIME / OPS, ITCNT REAL ITCNT, OPS REAL ZERO, ONE, TWO, HALF PARAMETER ( ZERO = 0.0E0, ONE = 1.0E0, TWO = 2.0E0,& HALF = 1.0E0 / TWO ) REAL FUDGE, RELFAC PARAMETER ( FUDGE = 2.0E0, RELFAC = 2.0E0 ) LOGICAL NCNVRG, TOOFEW INTEGER IB, IBEGIN, IDISCL, IDISCU, IE, IEND, IINFO,& IM, IN, IOFF, IORDER, IOUT, IRANGE, ITMAX,& ITMP1, IW, IWOFF, J, JB, JDISC, JE, NB, NWL,& NWU REAL ATOLI, BNORM, GL, GU, PIVMIN, RTOLI, SAFEMN,& TMP1, TMP2, TNORM, ULP, WKILL, WL, WLU, WU, WUL INTEGER IDUMMA( 1 ) LOGICAL LSAME INTEGER ILAENV REAL SLAMCH EXTERNAL LSAME, ILAENV, SLAMCH EXTERNAL SLAEBZ, XERBLA INTRINSIC ABS, INT, LOG, MAX, MIN, SQRT INFO = 0 IF( LSAME( RANGE, 'A' ) ) THEN IRANGE = 1 ELSE IF( LSAME( RANGE, 'V' ) ) THEN IRANGE = 2 ELSE IF( LSAME( RANGE, 'I' ) ) THEN IRANGE = 3 ELSE IRANGE = 0 END IF IF( LSAME( ORDER, 'B' ) ) THEN IORDER = 2 ELSE IF( LSAME( ORDER, 'E' ) ) THEN IORDER = 1 ELSE IORDER = 0 END IF IF( IRANGE.LE.0 ) THEN INFO = -1 ELSE IF( IORDER.LE.0 ) THEN INFO = -2 ELSE IF( N.LT.0 ) THEN INFO = -3 ELSE IF( IRANGE.EQ.2 ) THEN IF( VL.GE.VU ) INFO = -5 ELSE IF( IRANGE.EQ.3 .AND. ( IL.LT.1 .OR. IL.GT.MAX( 1, N ) ) )& THEN INFO = -6 ELSE IF( IRANGE.EQ.3 .AND. ( IU.LT.MIN( N, IL ) .OR. IU.GT.N ) )& THEN INFO = -7 END IF IF( INFO.NE.0 ) THEN CALL XERBLA( 'SSTEBZ', -INFO ) RETURN END IF INFO = 0 NCNVRG = .FALSE. TOOFEW = .FALSE. M = 0 IF( N.EQ.0 )& RETURN IF( IRANGE.EQ.3 .AND. IL.EQ.1 .AND. IU.EQ.N )& IRANGE = 1 SAFEMN = SLAMCH( 'S' ) ULP = SLAMCH( 'P' ) OPS = OPS + 1 RTOLI = ULP*RELFAC NB = ILAEN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -