version 1.6, 2011/07/22 07:38:05
|
version 1.21, 2023/08/07 08:38:51
|
Line 1
|
Line 1
|
SUBROUTINE DGSVJ0( JOBV, M, N, A, LDA, D, SVA, MV, V, LDV, EPS, |
*> \brief \b DGSVJ0 pre-processor for the routine dgesvj. |
$ SFMIN, TOL, NSWEEP, WORK, LWORK, INFO ) |
* |
|
* =========== DOCUMENTATION =========== |
* |
* |
* -- LAPACK routine (version 3.3.1) -- |
* Online html documentation available at |
|
* http://www.netlib.org/lapack/explore-html/ |
* |
* |
* -- Contributed by Zlatko Drmac of the University of Zagreb and -- |
*> \htmlonly |
* -- Kresimir Veselic of the Fernuniversitaet Hagen -- |
*> Download DGSVJ0 + dependencies |
* -- April 2011 -- |
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dgsvj0.f"> |
|
*> [TGZ]</a> |
|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dgsvj0.f"> |
|
*> [ZIP]</a> |
|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dgsvj0.f"> |
|
*> [TXT]</a> |
|
*> \endhtmlonly |
|
* |
|
* Definition: |
|
* =========== |
|
* |
|
* SUBROUTINE DGSVJ0( JOBV, M, N, A, LDA, D, SVA, MV, V, LDV, EPS, |
|
* SFMIN, TOL, NSWEEP, WORK, LWORK, INFO ) |
|
* |
|
* .. Scalar Arguments .. |
|
* INTEGER INFO, LDA, LDV, LWORK, M, MV, N, NSWEEP |
|
* DOUBLE PRECISION EPS, SFMIN, TOL |
|
* CHARACTER*1 JOBV |
|
* .. |
|
* .. Array Arguments .. |
|
* DOUBLE PRECISION A( LDA, * ), SVA( N ), D( N ), V( LDV, * ), |
|
* $ WORK( LWORK ) |
|
* .. |
|
* |
|
* |
|
*> \par Purpose: |
|
* ============= |
|
*> |
|
*> \verbatim |
|
*> |
|
*> DGSVJ0 is called from DGESVJ as a pre-processor and that is its main |
|
*> purpose. It applies Jacobi rotations in the same way as DGESVJ does, but |
|
*> it does not check convergence (stopping criterion). Few tuning |
|
*> parameters (marked by [TP]) are available for the implementer. |
|
*> \endverbatim |
|
* |
|
* Arguments: |
|
* ========== |
|
* |
|
*> \param[in] JOBV |
|
*> \verbatim |
|
*> JOBV is CHARACTER*1 |
|
*> Specifies whether the output from this procedure is used |
|
*> to compute the matrix V: |
|
*> = 'V': the product of the Jacobi rotations is accumulated |
|
*> by postmulyiplying the N-by-N array V. |
|
*> (See the description of V.) |
|
*> = 'A': the product of the Jacobi rotations is accumulated |
|
*> by postmulyiplying the MV-by-N array V. |
|
*> (See the descriptions of MV and V.) |
|
*> = 'N': the Jacobi rotations are not accumulated. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] M |
|
*> \verbatim |
|
*> M is INTEGER |
|
*> The number of rows of the input matrix A. M >= 0. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] N |
|
*> \verbatim |
|
*> N is INTEGER |
|
*> The number of columns of the input matrix A. |
|
*> M >= N >= 0. |
|
*> \endverbatim |
|
*> |
|
*> \param[in,out] A |
|
*> \verbatim |
|
*> A is DOUBLE PRECISION array, dimension (LDA,N) |
|
*> On entry, M-by-N matrix A, such that A*diag(D) represents |
|
*> the input matrix. |
|
*> On exit, |
|
*> A_onexit * D_onexit represents the input matrix A*diag(D) |
|
*> post-multiplied by a sequence of Jacobi rotations, where the |
|
*> rotation threshold and the total number of sweeps are given in |
|
*> TOL and NSWEEP, respectively. |
|
*> (See the descriptions of D, TOL and NSWEEP.) |
|
*> \endverbatim |
|
*> |
|
*> \param[in] LDA |
|
*> \verbatim |
|
*> LDA is INTEGER |
|
*> The leading dimension of the array A. LDA >= max(1,M). |
|
*> \endverbatim |
|
*> |
|
*> \param[in,out] D |
|
*> \verbatim |
|
*> D is DOUBLE PRECISION array, dimension (N) |
|
*> The array D accumulates the scaling factors from the fast scaled |
|
*> Jacobi rotations. |
|
*> On entry, A*diag(D) represents the input matrix. |
|
*> On exit, A_onexit*diag(D_onexit) represents the input matrix |
|
*> post-multiplied by a sequence of Jacobi rotations, where the |
|
*> rotation threshold and the total number of sweeps are given in |
|
*> TOL and NSWEEP, respectively. |
|
*> (See the descriptions of A, TOL and NSWEEP.) |
|
*> \endverbatim |
|
*> |
|
*> \param[in,out] SVA |
|
*> \verbatim |
|
*> SVA is DOUBLE PRECISION array, dimension (N) |
|
*> On entry, SVA contains the Euclidean norms of the columns of |
|
*> the matrix A*diag(D). |
|
*> On exit, SVA contains the Euclidean norms of the columns of |
|
*> the matrix onexit*diag(D_onexit). |
|
*> \endverbatim |
|
*> |
|
*> \param[in] MV |
|
*> \verbatim |
|
*> MV is INTEGER |
|
*> If JOBV = 'A', then MV rows of V are post-multipled by a |
|
*> sequence of Jacobi rotations. |
|
*> If JOBV = 'N', then MV is not referenced. |
|
*> \endverbatim |
|
*> |
|
*> \param[in,out] V |
|
*> \verbatim |
|
*> V is DOUBLE PRECISION array, dimension (LDV,N) |
|
*> If JOBV = 'V' then N rows of V are post-multipled by a |
|
*> sequence of Jacobi rotations. |
|
*> If JOBV = 'A' then MV rows of V are post-multipled by a |
|
*> sequence of Jacobi rotations. |
|
*> If JOBV = 'N', then V is not referenced. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] LDV |
|
*> \verbatim |
|
*> LDV is INTEGER |
|
*> The leading dimension of the array V, LDV >= 1. |
|
*> If JOBV = 'V', LDV >= N. |
|
*> If JOBV = 'A', LDV >= MV. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] EPS |
|
*> \verbatim |
|
*> EPS is DOUBLE PRECISION |
|
*> EPS = DLAMCH('Epsilon') |
|
*> \endverbatim |
|
*> |
|
*> \param[in] SFMIN |
|
*> \verbatim |
|
*> SFMIN is DOUBLE PRECISION |
|
*> SFMIN = DLAMCH('Safe Minimum') |
|
*> \endverbatim |
|
*> |
|
*> \param[in] TOL |
|
*> \verbatim |
|
*> TOL is DOUBLE PRECISION |
|
*> TOL is the threshold for Jacobi rotations. For a pair |
|
*> A(:,p), A(:,q) of pivot columns, the Jacobi rotation is |
|
*> applied only if DABS(COS(angle(A(:,p),A(:,q)))) > TOL. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] NSWEEP |
|
*> \verbatim |
|
*> NSWEEP is INTEGER |
|
*> NSWEEP is the number of sweeps of Jacobi rotations to be |
|
*> performed. |
|
*> \endverbatim |
|
*> |
|
*> \param[out] WORK |
|
*> \verbatim |
|
*> WORK is DOUBLE PRECISION array, dimension (LWORK) |
|
*> \endverbatim |
|
*> |
|
*> \param[in] LWORK |
|
*> \verbatim |
|
*> LWORK is INTEGER |
|
*> LWORK is the dimension of WORK. LWORK >= M. |
|
*> \endverbatim |
|
*> |
|
*> \param[out] INFO |
|
*> \verbatim |
|
*> INFO is INTEGER |
|
*> = 0: successful exit. |
|
*> < 0: if INFO = -i, then the i-th argument had an illegal value |
|
*> \endverbatim |
|
* |
|
* Authors: |
|
* ======== |
|
* |
|
*> \author Univ. of Tennessee |
|
*> \author Univ. of California Berkeley |
|
*> \author Univ. of Colorado Denver |
|
*> \author NAG Ltd. |
|
* |
|
*> \ingroup doubleOTHERcomputational |
|
* |
|
*> \par Further Details: |
|
* ===================== |
|
*> |
|
*> DGSVJ0 is used just to enable DGESVJ to call a simplified version of |
|
*> itself to work on a submatrix of the original matrix. |
|
*> |
|
*> \par Contributors: |
|
* ================== |
|
*> |
|
*> Zlatko Drmac (Zagreb, Croatia) and Kresimir Veselic (Hagen, Germany) |
|
*> |
|
*> \par Bugs, Examples and Comments: |
|
* ================================= |
|
*> |
|
*> Please report all bugs and send interesting test examples and comments to |
|
*> drmac@math.hr. Thank you. |
* |
* |
|
* ===================================================================== |
|
SUBROUTINE DGSVJ0( JOBV, M, N, A, LDA, D, SVA, MV, V, LDV, EPS, |
|
$ SFMIN, TOL, NSWEEP, WORK, LWORK, INFO ) |
|
* |
|
* -- LAPACK computational routine -- |
* -- LAPACK is a software package provided by Univ. of Tennessee, -- |
* -- LAPACK is a software package provided by Univ. of Tennessee, -- |
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
* |
* |
* This routine is also part of SIGMA (version 1.23, October 23. 2008.) |
|
* SIGMA is a library of algorithms for highly accurate algorithms for |
|
* computation of SVD, PSVD, QSVD, (H,K)-SVD, and for solution of the |
|
* eigenvalue problems Hx = lambda M x, H M x = lambda x with H, M > 0. |
|
* |
|
IMPLICIT NONE |
|
* .. |
|
* .. Scalar Arguments .. |
* .. Scalar Arguments .. |
INTEGER INFO, LDA, LDV, LWORK, M, MV, N, NSWEEP |
INTEGER INFO, LDA, LDV, LWORK, M, MV, N, NSWEEP |
DOUBLE PRECISION EPS, SFMIN, TOL |
DOUBLE PRECISION EPS, SFMIN, TOL |
Line 27
|
Line 230
|
$ WORK( LWORK ) |
$ WORK( LWORK ) |
* .. |
* .. |
* |
* |
* Purpose |
|
* ======= |
|
* |
|
* DGSVJ0 is called from DGESVJ as a pre-processor and that is its main |
|
* purpose. It applies Jacobi rotations in the same way as DGESVJ does, but |
|
* it does not check convergence (stopping criterion). Few tuning |
|
* parameters (marked by [TP]) are available for the implementer. |
|
* |
|
* Further Details |
|
* ~~~~~~~~~~~~~~~ |
|
* DGSVJ0 is used just to enable SGESVJ to call a simplified version of |
|
* itself to work on a submatrix of the original matrix. |
|
* |
|
* Contributors |
|
* ~~~~~~~~~~~~ |
|
* Zlatko Drmac (Zagreb, Croatia) and Kresimir Veselic (Hagen, Germany) |
|
* |
|
* Bugs, Examples and Comments |
|
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
* Please report all bugs and send interesting test examples and comments to |
|
* drmac@math.hr. Thank you. |
|
* |
|
* Arguments |
|
* ========= |
|
* |
|
* JOBV (input) CHARACTER*1 |
|
* Specifies whether the output from this procedure is used |
|
* to compute the matrix V: |
|
* = 'V': the product of the Jacobi rotations is accumulated |
|
* by postmulyiplying the N-by-N array V. |
|
* (See the description of V.) |
|
* = 'A': the product of the Jacobi rotations is accumulated |
|
* by postmulyiplying the MV-by-N array V. |
|
* (See the descriptions of MV and V.) |
|
* = 'N': the Jacobi rotations are not accumulated. |
|
* |
|
* M (input) INTEGER |
|
* The number of rows of the input matrix A. M >= 0. |
|
* |
|
* N (input) INTEGER |
|
* The number of columns of the input matrix A. |
|
* M >= N >= 0. |
|
* |
|
* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) |
|
* On entry, M-by-N matrix A, such that A*diag(D) represents |
|
* the input matrix. |
|
* On exit, |
|
* A_onexit * D_onexit represents the input matrix A*diag(D) |
|
* post-multiplied by a sequence of Jacobi rotations, where the |
|
* rotation threshold and the total number of sweeps are given in |
|
* TOL and NSWEEP, respectively. |
|
* (See the descriptions of D, TOL and NSWEEP.) |
|
* |
|
* LDA (input) INTEGER |
|
* The leading dimension of the array A. LDA >= max(1,M). |
|
* |
|
* D (input/workspace/output) DOUBLE PRECISION array, dimension (N) |
|
* The array D accumulates the scaling factors from the fast scaled |
|
* Jacobi rotations. |
|
* On entry, A*diag(D) represents the input matrix. |
|
* On exit, A_onexit*diag(D_onexit) represents the input matrix |
|
* post-multiplied by a sequence of Jacobi rotations, where the |
|
* rotation threshold and the total number of sweeps are given in |
|
* TOL and NSWEEP, respectively. |
|
* (See the descriptions of A, TOL and NSWEEP.) |
|
* |
|
* SVA (input/workspace/output) DOUBLE PRECISION array, dimension (N) |
|
* On entry, SVA contains the Euclidean norms of the columns of |
|
* the matrix A*diag(D). |
|
* On exit, SVA contains the Euclidean norms of the columns of |
|
* the matrix onexit*diag(D_onexit). |
|
* |
|
* MV (input) INTEGER |
|
* If JOBV .EQ. 'A', then MV rows of V are post-multipled by a |
|
* sequence of Jacobi rotations. |
|
* If JOBV = 'N', then MV is not referenced. |
|
* |
|
* V (input/output) DOUBLE PRECISION array, dimension (LDV,N) |
|
* If JOBV .EQ. 'V' then N rows of V are post-multipled by a |
|
* sequence of Jacobi rotations. |
|
* If JOBV .EQ. 'A' then MV rows of V are post-multipled by a |
|
* sequence of Jacobi rotations. |
|
* If JOBV = 'N', then V is not referenced. |
|
* |
|
* LDV (input) INTEGER |
|
* The leading dimension of the array V, LDV >= 1. |
|
* If JOBV = 'V', LDV .GE. N. |
|
* If JOBV = 'A', LDV .GE. MV. |
|
* |
|
* EPS (input) DOUBLE PRECISION |
|
* EPS = DLAMCH('Epsilon') |
|
* |
|
* SFMIN (input) DOUBLE PRECISION |
|
* SFMIN = DLAMCH('Safe Minimum') |
|
* |
|
* TOL (input) DOUBLE PRECISION |
|
* TOL is the threshold for Jacobi rotations. For a pair |
|
* A(:,p), A(:,q) of pivot columns, the Jacobi rotation is |
|
* applied only if DABS(COS(angle(A(:,p),A(:,q)))) .GT. TOL. |
|
* |
|
* NSWEEP (input) INTEGER |
|
* NSWEEP is the number of sweeps of Jacobi rotations to be |
|
* performed. |
|
* |
|
* WORK (workspace) DOUBLE PRECISION array, dimension (LWORK) |
|
* |
|
* LWORK (input) INTEGER |
|
* LWORK is the dimension of WORK. LWORK .GE. M. |
|
* |
|
* INFO (output) INTEGER |
|
* = 0 : successful exit. |
|
* < 0 : if INFO = -i, then the i-th argument had an illegal value |
|
* |
|
* ===================================================================== |
* ===================================================================== |
* |
* |
* .. Local Parameters .. |
* .. Local Parameters .. |
DOUBLE PRECISION ZERO, HALF, ONE, TWO |
DOUBLE PRECISION ZERO, HALF, ONE |
PARAMETER ( ZERO = 0.0D0, HALF = 0.5D0, ONE = 1.0D0, |
PARAMETER ( ZERO = 0.0D0, HALF = 0.5D0, ONE = 1.0D0) |
$ TWO = 2.0D0 ) |
|
* .. |
* .. |
* .. Local Scalars .. |
* .. Local Scalars .. |
DOUBLE PRECISION AAPP, AAPP0, AAPQ, AAQQ, APOAQ, AQOAP, BIG, |
DOUBLE PRECISION AAPP, AAPP0, AAPQ, AAQQ, APOAQ, AQOAP, BIG, |
Line 161
|
Line 250
|
DOUBLE PRECISION FASTR( 5 ) |
DOUBLE PRECISION FASTR( 5 ) |
* .. |
* .. |
* .. Intrinsic Functions .. |
* .. Intrinsic Functions .. |
INTRINSIC DABS, DMAX1, DBLE, MIN0, DSIGN, DSQRT |
INTRINSIC DABS, MAX, DBLE, MIN, DSIGN, DSQRT |
* .. |
* .. |
* .. External Functions .. |
* .. External Functions .. |
DOUBLE PRECISION DDOT, DNRM2 |
DOUBLE PRECISION DDOT, DNRM2 |
Line 170
|
Line 259
|
EXTERNAL IDAMAX, LSAME, DDOT, DNRM2 |
EXTERNAL IDAMAX, LSAME, DDOT, DNRM2 |
* .. |
* .. |
* .. External Subroutines .. |
* .. External Subroutines .. |
EXTERNAL DAXPY, DCOPY, DLASCL, DLASSQ, DROTM, DSWAP |
EXTERNAL DAXPY, DCOPY, DLASCL, DLASSQ, DROTM, DSWAP, |
|
$ XERBLA |
* .. |
* .. |
* .. Executable Statements .. |
* .. Executable Statements .. |
* |
* |
Line 188
|
Line 278
|
INFO = -5 |
INFO = -5 |
ELSE IF( ( RSVEC.OR.APPLV ) .AND. ( MV.LT.0 ) ) THEN |
ELSE IF( ( RSVEC.OR.APPLV ) .AND. ( MV.LT.0 ) ) THEN |
INFO = -8 |
INFO = -8 |
ELSE IF( ( RSVEC.AND.( LDV.LT.N ) ).OR. |
ELSE IF( ( RSVEC.AND.( LDV.LT.N ) ).OR. |
$ ( APPLV.AND.( LDV.LT.MV ) ) ) THEN |
$ ( APPLV.AND.( LDV.LT.MV ) ) ) THEN |
INFO = -10 |
INFO = -10 |
ELSE IF( TOL.LE.EPS ) THEN |
ELSE IF( TOL.LE.EPS ) THEN |
Line 237
|
Line 327
|
* Jacobi SVD algorithm SGESVJ. For sweeps i=1:SWBAND the procedure |
* Jacobi SVD algorithm SGESVJ. For sweeps i=1:SWBAND the procedure |
* ...... |
* ...... |
|
|
KBL = MIN0( 8, N ) |
KBL = MIN( 8, N ) |
*[TP] KBL is a tuning parameter that defines the tile size in the |
*[TP] KBL is a tuning parameter that defines the tile size in the |
* tiling of the p-q loops of pivot pairs. In general, an optimal |
* tiling of the p-q loops of pivot pairs. In general, an optimal |
* value of KBL depends on the matrix dimensions and on the |
* value of KBL depends on the matrix dimensions and on the |
Line 249
|
Line 339
|
BLSKIP = ( KBL**2 ) + 1 |
BLSKIP = ( KBL**2 ) + 1 |
*[TP] BLKSKIP is a tuning parameter that depends on SWBAND and KBL. |
*[TP] BLKSKIP is a tuning parameter that depends on SWBAND and KBL. |
|
|
ROWSKIP = MIN0( 5, KBL ) |
ROWSKIP = MIN( 5, KBL ) |
*[TP] ROWSKIP is a tuning parameter. |
*[TP] ROWSKIP is a tuning parameter. |
|
|
LKAHEAD = 1 |
LKAHEAD = 1 |
Line 271
|
Line 361
|
|
|
igl = ( ibr-1 )*KBL + 1 |
igl = ( ibr-1 )*KBL + 1 |
* |
* |
DO 1002 ir1 = 0, MIN0( LKAHEAD, NBL-ibr ) |
DO 1002 ir1 = 0, MIN( LKAHEAD, NBL-ibr ) |
* |
* |
igl = igl + ir1*KBL |
igl = igl + ir1*KBL |
* |
* |
DO 2001 p = igl, MIN0( igl+KBL-1, N-1 ) |
DO 2001 p = igl, MIN( igl+KBL-1, N-1 ) |
|
|
* .. de Rijk's pivoting |
* .. de Rijk's pivoting |
q = IDAMAX( N-p+1, SVA( p ), 1 ) + p - 1 |
q = IDAMAX( N-p+1, SVA( p ), 1 ) + p - 1 |
Line 299
|
Line 389
|
* Some BLAS implementations compute DNRM2(M,A(1,p),1) |
* Some BLAS implementations compute DNRM2(M,A(1,p),1) |
* as DSQRT(DDOT(M,A(1,p),1,A(1,p),1)), which may result in |
* as DSQRT(DDOT(M,A(1,p),1,A(1,p),1)), which may result in |
* overflow for ||A(:,p)||_2 > DSQRT(overflow_threshold), and |
* overflow for ||A(:,p)||_2 > DSQRT(overflow_threshold), and |
* undeflow for ||A(:,p)||_2 < DSQRT(underflow_threshold). |
* underflow for ||A(:,p)||_2 < DSQRT(underflow_threshold). |
* Hence, DNRM2 cannot be trusted, not even in the case when |
* Hence, DNRM2 cannot be trusted, not even in the case when |
* the true norm is far from the under(over)flow boundaries. |
* the true norm is far from the under(over)flow boundaries. |
* If properly implemented DNRM2 is available, the IF-THEN-ELSE |
* If properly implemented DNRM2 is available, the IF-THEN-ELSE |
Line 324
|
Line 414
|
* |
* |
PSKIPPED = 0 |
PSKIPPED = 0 |
* |
* |
DO 2002 q = p + 1, MIN0( igl+KBL-1, N ) |
DO 2002 q = p + 1, MIN( igl+KBL-1, N ) |
* |
* |
AAQQ = SVA( q ) |
AAQQ = SVA( q ) |
|
|
Line 359
|
Line 449
|
END IF |
END IF |
END IF |
END IF |
* |
* |
MXAAPQ = DMAX1( MXAAPQ, DABS( AAPQ ) ) |
MXAAPQ = MAX( MXAAPQ, DABS( AAPQ ) ) |
* |
* |
* TO rotate or NOT to rotate, THAT is the question ... |
* TO rotate or NOT to rotate, THAT is the question ... |
* |
* |
Line 391
|
Line 481
|
$ V( 1, p ), 1, |
$ V( 1, p ), 1, |
$ V( 1, q ), 1, |
$ V( 1, q ), 1, |
$ FASTR ) |
$ FASTR ) |
SVA( q ) = AAQQ*DSQRT( DMAX1( ZERO, |
SVA( q ) = AAQQ*DSQRT( MAX( ZERO, |
$ ONE+T*APOAQ*AAPQ ) ) |
$ ONE+T*APOAQ*AAPQ ) ) |
AAPP = AAPP*DSQRT( DMAX1( ZERO, |
AAPP = AAPP*DSQRT( MAX( ZERO, |
$ ONE-T*AQOAP*AAPQ ) ) |
$ ONE-T*AQOAP*AAPQ ) ) |
MXSINJ = DMAX1( MXSINJ, DABS( T ) ) |
MXSINJ = MAX( MXSINJ, DABS( T ) ) |
* |
* |
ELSE |
ELSE |
* |
* |
Line 407
|
Line 497
|
CS = DSQRT( ONE / ( ONE+T*T ) ) |
CS = DSQRT( ONE / ( ONE+T*T ) ) |
SN = T*CS |
SN = T*CS |
* |
* |
MXSINJ = DMAX1( MXSINJ, DABS( SN ) ) |
MXSINJ = MAX( MXSINJ, DABS( SN ) ) |
SVA( q ) = AAQQ*DSQRT( DMAX1( ZERO, |
SVA( q ) = AAQQ*DSQRT( MAX( ZERO, |
$ ONE+T*APOAQ*AAPQ ) ) |
$ ONE+T*APOAQ*AAPQ ) ) |
AAPP = AAPP*DSQRT( DMAX1( ZERO, |
AAPP = AAPP*DSQRT( MAX( ZERO, |
$ ONE-T*AQOAP*AAPQ ) ) |
$ ONE-T*AQOAP*AAPQ ) ) |
* |
* |
APOAQ = D( p ) / D( q ) |
APOAQ = D( p ) / D( q ) |
Line 521
|
Line 611
|
$ A( 1, q ), 1 ) |
$ A( 1, q ), 1 ) |
CALL DLASCL( 'G', 0, 0, ONE, AAQQ, M, |
CALL DLASCL( 'G', 0, 0, ONE, AAQQ, M, |
$ 1, A( 1, q ), LDA, IERR ) |
$ 1, A( 1, q ), LDA, IERR ) |
SVA( q ) = AAQQ*DSQRT( DMAX1( ZERO, |
SVA( q ) = AAQQ*DSQRT( MAX( ZERO, |
$ ONE-AAPQ*AAPQ ) ) |
$ ONE-AAPQ*AAPQ ) ) |
MXSINJ = DMAX1( MXSINJ, SFMIN ) |
MXSINJ = MAX( MXSINJ, SFMIN ) |
END IF |
END IF |
* END IF ROTOK THEN ... ELSE |
* END IF ROTOK THEN ... ELSE |
* |
* |
Line 587
|
Line 677
|
ELSE |
ELSE |
SVA( p ) = AAPP |
SVA( p ) = AAPP |
IF( ( ir1.EQ.0 ) .AND. ( AAPP.EQ.ZERO ) ) |
IF( ( ir1.EQ.0 ) .AND. ( AAPP.EQ.ZERO ) ) |
$ NOTROT = NOTROT + MIN0( igl+KBL-1, N ) - p |
$ NOTROT = NOTROT + MIN( igl+KBL-1, N ) - p |
END IF |
END IF |
* |
* |
2001 CONTINUE |
2001 CONTINUE |
Line 608
|
Line 698
|
* doing the block at ( ibr, jbc ) |
* doing the block at ( ibr, jbc ) |
* |
* |
IJBLSK = 0 |
IJBLSK = 0 |
DO 2100 p = igl, MIN0( igl+KBL-1, N ) |
DO 2100 p = igl, MIN( igl+KBL-1, N ) |
* |
* |
AAPP = SVA( p ) |
AAPP = SVA( p ) |
* |
* |
Line 616
|
Line 706
|
* |
* |
PSKIPPED = 0 |
PSKIPPED = 0 |
* |
* |
DO 2200 q = jgl, MIN0( jgl+KBL-1, N ) |
DO 2200 q = jgl, MIN( jgl+KBL-1, N ) |
* |
* |
AAQQ = SVA( q ) |
AAQQ = SVA( q ) |
* |
* |
Line 663
|
Line 753
|
END IF |
END IF |
END IF |
END IF |
* |
* |
MXAAPQ = DMAX1( MXAAPQ, DABS( AAPQ ) ) |
MXAAPQ = MAX( MXAAPQ, DABS( AAPQ ) ) |
* |
* |
* TO rotate or NOT to rotate, THAT is the question ... |
* TO rotate or NOT to rotate, THAT is the question ... |
* |
* |
Line 690
|
Line 780
|
$ V( 1, p ), 1, |
$ V( 1, p ), 1, |
$ V( 1, q ), 1, |
$ V( 1, q ), 1, |
$ FASTR ) |
$ FASTR ) |
SVA( q ) = AAQQ*DSQRT( DMAX1( ZERO, |
SVA( q ) = AAQQ*DSQRT( MAX( ZERO, |
$ ONE+T*APOAQ*AAPQ ) ) |
$ ONE+T*APOAQ*AAPQ ) ) |
AAPP = AAPP*DSQRT( DMAX1( ZERO, |
AAPP = AAPP*DSQRT( MAX( ZERO, |
$ ONE-T*AQOAP*AAPQ ) ) |
$ ONE-T*AQOAP*AAPQ ) ) |
MXSINJ = DMAX1( MXSINJ, DABS( T ) ) |
MXSINJ = MAX( MXSINJ, DABS( T ) ) |
ELSE |
ELSE |
* |
* |
* .. choose correct signum for THETA and rotate |
* .. choose correct signum for THETA and rotate |
Line 705
|
Line 795
|
$ DSQRT( ONE+THETA*THETA ) ) |
$ DSQRT( ONE+THETA*THETA ) ) |
CS = DSQRT( ONE / ( ONE+T*T ) ) |
CS = DSQRT( ONE / ( ONE+T*T ) ) |
SN = T*CS |
SN = T*CS |
MXSINJ = DMAX1( MXSINJ, DABS( SN ) ) |
MXSINJ = MAX( MXSINJ, DABS( SN ) ) |
SVA( q ) = AAQQ*DSQRT( DMAX1( ZERO, |
SVA( q ) = AAQQ*DSQRT( MAX( ZERO, |
$ ONE+T*APOAQ*AAPQ ) ) |
$ ONE+T*APOAQ*AAPQ ) ) |
AAPP = AAPP*DSQRT( DMAX1( ZERO, |
AAPP = AAPP*DSQRT( MAX( ZERO, |
$ ONE-T*AQOAP*AAPQ ) ) |
$ ONE-T*AQOAP*AAPQ ) ) |
* |
* |
APOAQ = D( p ) / D( q ) |
APOAQ = D( p ) / D( q ) |
Line 823
|
Line 913
|
CALL DLASCL( 'G', 0, 0, ONE, AAQQ, |
CALL DLASCL( 'G', 0, 0, ONE, AAQQ, |
$ M, 1, A( 1, q ), LDA, |
$ M, 1, A( 1, q ), LDA, |
$ IERR ) |
$ IERR ) |
SVA( q ) = AAQQ*DSQRT( DMAX1( ZERO, |
SVA( q ) = AAQQ*DSQRT( MAX( ZERO, |
$ ONE-AAPQ*AAPQ ) ) |
$ ONE-AAPQ*AAPQ ) ) |
MXSINJ = DMAX1( MXSINJ, SFMIN ) |
MXSINJ = MAX( MXSINJ, SFMIN ) |
ELSE |
ELSE |
CALL DCOPY( M, A( 1, q ), 1, WORK, |
CALL DCOPY( M, A( 1, q ), 1, WORK, |
$ 1 ) |
$ 1 ) |
Line 840
|
Line 930
|
CALL DLASCL( 'G', 0, 0, ONE, AAPP, |
CALL DLASCL( 'G', 0, 0, ONE, AAPP, |
$ M, 1, A( 1, p ), LDA, |
$ M, 1, A( 1, p ), LDA, |
$ IERR ) |
$ IERR ) |
SVA( p ) = AAPP*DSQRT( DMAX1( ZERO, |
SVA( p ) = AAPP*DSQRT( MAX( ZERO, |
$ ONE-AAPQ*AAPQ ) ) |
$ ONE-AAPQ*AAPQ ) ) |
MXSINJ = DMAX1( MXSINJ, SFMIN ) |
MXSINJ = MAX( MXSINJ, SFMIN ) |
END IF |
END IF |
END IF |
END IF |
* END IF ROTOK THEN ... ELSE |
* END IF ROTOK THEN ... ELSE |
Line 910
|
Line 1000
|
* |
* |
ELSE |
ELSE |
IF( AAPP.EQ.ZERO )NOTROT = NOTROT + |
IF( AAPP.EQ.ZERO )NOTROT = NOTROT + |
$ MIN0( jgl+KBL-1, N ) - jgl + 1 |
$ MIN( jgl+KBL-1, N ) - jgl + 1 |
IF( AAPP.LT.ZERO )NOTROT = 0 |
IF( AAPP.LT.ZERO )NOTROT = 0 |
END IF |
END IF |
|
|
Line 920
|
Line 1010
|
* end of the jbc-loop |
* end of the jbc-loop |
2011 CONTINUE |
2011 CONTINUE |
*2011 bailed out of the jbc-loop |
*2011 bailed out of the jbc-loop |
DO 2012 p = igl, MIN0( igl+KBL-1, N ) |
DO 2012 p = igl, MIN( igl+KBL-1, N ) |
SVA( p ) = DABS( SVA( p ) ) |
SVA( p ) = DABS( SVA( p ) ) |
2012 CONTINUE |
2012 CONTINUE |
* |
* |
Line 952
|
Line 1042
|
|
|
1993 CONTINUE |
1993 CONTINUE |
* end i=1:NSWEEP loop |
* end i=1:NSWEEP loop |
* #:) Reaching this point means that the procedure has comleted the given |
* #:) Reaching this point means that the procedure has completed the given |
* number of iterations. |
* number of iterations. |
INFO = NSWEEP - 1 |
INFO = NSWEEP - 1 |
GO TO 1995 |
GO TO 1995 |