ssbevx.f.html
来自「famous linear algebra library (LAPACK) p」· HTML 代码 · 共 440 行 · 第 1/3 页
HTML
440 行
IF( ANRM.GT.ZERO .AND. ANRM.LT.RMIN ) THEN
ISCALE = 1
SIGMA = RMIN / ANRM
ELSE IF( ANRM.GT.RMAX ) THEN
ISCALE = 1
SIGMA = RMAX / ANRM
END IF
IF( ISCALE.EQ.1 ) THEN
IF( LOWER ) THEN
CALL <a name="SLASCL.285"></a><a href="slascl.f.html#SLASCL.1">SLASCL</a>( <span class="string">'B'</span>, KD, KD, ONE, SIGMA, N, N, AB, LDAB, INFO )
ELSE
CALL <a name="SLASCL.287"></a><a href="slascl.f.html#SLASCL.1">SLASCL</a>( <span class="string">'Q'</span>, KD, KD, ONE, SIGMA, N, N, AB, LDAB, INFO )
END IF
IF( ABSTOL.GT.0 )
$ ABSTLL = ABSTOL*SIGMA
IF( VALEIG ) THEN
VLL = VL*SIGMA
VUU = VU*SIGMA
END IF
END IF
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Call <a name="SSBTRD.297"></a><a href="ssbtrd.f.html#SSBTRD.1">SSBTRD</a> to reduce symmetric band matrix to tridiagonal form.
</span><span class="comment">*</span><span class="comment">
</span> INDD = 1
INDE = INDD + N
INDWRK = INDE + N
CALL <a name="SSBTRD.302"></a><a href="ssbtrd.f.html#SSBTRD.1">SSBTRD</a>( JOBZ, UPLO, N, KD, AB, LDAB, WORK( INDD ),
$ WORK( INDE ), Q, LDQ, WORK( INDWRK ), IINFO )
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> If all eigenvalues are desired and ABSTOL is less than or equal
</span><span class="comment">*</span><span class="comment"> to zero, then call <a name="SSTERF.306"></a><a href="ssterf.f.html#SSTERF.1">SSTERF</a> or <a name="SSTEQR.306"></a><a href="ssteqr.f.html#SSTEQR.1">SSTEQR</a>. If this fails for some
</span><span class="comment">*</span><span class="comment"> eigenvalue, then try <a name="SSTEBZ.307"></a><a href="sstebz.f.html#SSTEBZ.1">SSTEBZ</a>.
</span><span class="comment">*</span><span class="comment">
</span> TEST = .FALSE.
IF (INDEIG) THEN
IF (IL.EQ.1 .AND. IU.EQ.N) THEN
TEST = .TRUE.
END IF
END IF
IF ((ALLEIG .OR. TEST) .AND. (ABSTOL.LE.ZERO)) THEN
CALL SCOPY( N, WORK( INDD ), 1, W, 1 )
INDEE = INDWRK + 2*N
IF( .NOT.WANTZ ) THEN
CALL SCOPY( N-1, WORK( INDE ), 1, WORK( INDEE ), 1 )
CALL <a name="SSTERF.320"></a><a href="ssterf.f.html#SSTERF.1">SSTERF</a>( N, W, WORK( INDEE ), INFO )
ELSE
CALL <a name="SLACPY.322"></a><a href="slacpy.f.html#SLACPY.1">SLACPY</a>( <span class="string">'A'</span>, N, N, Q, LDQ, Z, LDZ )
CALL SCOPY( N-1, WORK( INDE ), 1, WORK( INDEE ), 1 )
CALL <a name="SSTEQR.324"></a><a href="ssteqr.f.html#SSTEQR.1">SSTEQR</a>( JOBZ, N, W, WORK( INDEE ), Z, LDZ,
$ WORK( INDWRK ), INFO )
IF( INFO.EQ.0 ) THEN
DO 10 I = 1, N
IFAIL( I ) = 0
10 CONTINUE
END IF
END IF
IF( INFO.EQ.0 ) THEN
M = N
GO TO 30
END IF
INFO = 0
END IF
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Otherwise, call <a name="SSTEBZ.339"></a><a href="sstebz.f.html#SSTEBZ.1">SSTEBZ</a> and, if eigenvectors are desired, <a name="SSTEIN.339"></a><a href="sstein.f.html#SSTEIN.1">SSTEIN</a>.
</span><span class="comment">*</span><span class="comment">
</span> IF( WANTZ ) THEN
ORDER = <span class="string">'B'</span>
ELSE
ORDER = <span class="string">'E'</span>
END IF
INDIBL = 1
INDISP = INDIBL + N
INDIWO = INDISP + N
CALL <a name="SSTEBZ.349"></a><a href="sstebz.f.html#SSTEBZ.1">SSTEBZ</a>( RANGE, ORDER, N, VLL, VUU, IL, IU, ABSTLL,
$ WORK( INDD ), WORK( INDE ), M, NSPLIT, W,
$ IWORK( INDIBL ), IWORK( INDISP ), WORK( INDWRK ),
$ IWORK( INDIWO ), INFO )
<span class="comment">*</span><span class="comment">
</span> IF( WANTZ ) THEN
CALL <a name="SSTEIN.355"></a><a href="sstein.f.html#SSTEIN.1">SSTEIN</a>( N, WORK( INDD ), WORK( INDE ), M, W,
$ IWORK( INDIBL ), IWORK( INDISP ), Z, LDZ,
$ WORK( INDWRK ), IWORK( INDIWO ), IFAIL, INFO )
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> Apply orthogonal matrix used in reduction to tridiagonal
</span><span class="comment">*</span><span class="comment"> form to eigenvectors returned by <a name="SSTEIN.360"></a><a href="sstein.f.html#SSTEIN.1">SSTEIN</a>.
</span><span class="comment">*</span><span class="comment">
</span> DO 20 J = 1, M
CALL SCOPY( N, Z( 1, J ), 1, WORK( 1 ), 1 )
CALL SGEMV( <span class="string">'N'</span>, N, N, ONE, Q, LDQ, WORK, 1, ZERO,
$ Z( 1, J ), 1 )
20 CONTINUE
END IF
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> If matrix was scaled, then rescale eigenvalues appropriately.
</span><span class="comment">*</span><span class="comment">
</span> 30 CONTINUE
IF( ISCALE.EQ.1 ) THEN
IF( INFO.EQ.0 ) THEN
IMAX = M
ELSE
IMAX = INFO - 1
END IF
CALL SSCAL( IMAX, ONE / SIGMA, W, 1 )
END IF
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> If eigenvalues are not in order, then sort them, along with
</span><span class="comment">*</span><span class="comment"> eigenvectors.
</span><span class="comment">*</span><span class="comment">
</span> IF( WANTZ ) THEN
DO 50 J = 1, M - 1
I = 0
TMP1 = W( J )
DO 40 JJ = J + 1, M
IF( W( JJ ).LT.TMP1 ) THEN
I = JJ
TMP1 = W( JJ )
END IF
40 CONTINUE
<span class="comment">*</span><span class="comment">
</span> IF( I.NE.0 ) THEN
ITMP1 = IWORK( INDIBL+I-1 )
W( I ) = W( J )
IWORK( INDIBL+I-1 ) = IWORK( INDIBL+J-1 )
W( J ) = TMP1
IWORK( INDIBL+J-1 ) = ITMP1
CALL SSWAP( N, Z( 1, I ), 1, Z( 1, J ), 1 )
IF( INFO.NE.0 ) THEN
ITMP1 = IFAIL( I )
IFAIL( I ) = IFAIL( J )
IFAIL( J ) = ITMP1
END IF
END IF
50 CONTINUE
END IF
<span class="comment">*</span><span class="comment">
</span> RETURN
<span class="comment">*</span><span class="comment">
</span><span class="comment">*</span><span class="comment"> End of <a name="SSBEVX.413"></a><a href="ssbevx.f.html#SSBEVX.1">SSBEVX</a>
</span><span class="comment">*</span><span class="comment">
</span> END
</pre>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?