--- rpl/lapack/lapack/dgsvj1.f 2010/08/07 13:21:03 1.1
+++ rpl/lapack/lapack/dgsvj1.f 2023/08/07 08:38:51 1.22
@@ -1,22 +1,243 @@
- SUBROUTINE DGSVJ1( JOBV, M, N, N1, A, LDA, D, SVA, MV, V, LDV,
- + EPS, SFMIN, TOL, NSWEEP, WORK, LWORK, INFO )
+*> \brief \b DGSVJ1 pre-processor for the routine dgesvj, applies Jacobi rotations targeting only particular pivots.
+*
+* =========== DOCUMENTATION ===========
+*
+* Online html documentation available at
+* http://www.netlib.org/lapack/explore-html/
*
-* -- LAPACK routine (version 3.2.2) --
+*> \htmlonly
+*> Download DGSVJ1 + dependencies
+*>
+*> [TGZ]
+*>
+*> [ZIP]
+*>
+*> [TXT]
+*> \endhtmlonly
+*
+* Definition:
+* ===========
+*
+* SUBROUTINE DGSVJ1( JOBV, M, N, N1, A, LDA, D, SVA, MV, V, LDV,
+* EPS, SFMIN, TOL, NSWEEP, WORK, LWORK, INFO )
+*
+* .. Scalar Arguments ..
+* DOUBLE PRECISION EPS, SFMIN, TOL
+* INTEGER INFO, LDA, LDV, LWORK, M, MV, N, N1, NSWEEP
+* CHARACTER*1 JOBV
+* ..
+* .. Array Arguments ..
+* DOUBLE PRECISION A( LDA, * ), D( N ), SVA( N ), V( LDV, * ),
+* $ WORK( LWORK )
+* ..
+*
+*
+*> \par Purpose:
+* =============
+*>
+*> \verbatim
+*>
+*> DGSVJ1 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 targets only particular pivots and it does not check convergence
+*> (stopping criterion). Few tuning parameters (marked by [TP]) are
+*> available for the implementer.
+*>
+*> Further Details
+*> ~~~~~~~~~~~~~~~
+*> DGSVJ1 applies few sweeps of Jacobi rotations in the column space of
+*> the input M-by-N matrix A. The pivot pairs are taken from the (1,2)
+*> off-diagonal block in the corresponding N-by-N Gram matrix A^T * A. The
+*> block-entries (tiles) of the (1,2) off-diagonal block are marked by the
+*> [x]'s in the following scheme:
+*>
+*> | * * * [x] [x] [x]|
+*> | * * * [x] [x] [x]| Row-cycling in the nblr-by-nblc [x] blocks.
+*> | * * * [x] [x] [x]| Row-cyclic pivoting inside each [x] block.
+*> |[x] [x] [x] * * * |
+*> |[x] [x] [x] * * * |
+*> |[x] [x] [x] * * * |
+*>
+*> In terms of the columns of A, the first N1 columns are rotated 'against'
+*> the remaining N-N1 columns, trying to increase the angle between the
+*> corresponding subspaces. The off-diagonal block is N1-by(N-N1) and it is
+*> tiled using quadratic tiles of side KBL. Here, KBL is a tuning parameter.
+*> The number of sweeps is given in NSWEEP and the orthogonality threshold
+*> is given in TOL.
+*> \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] N1
+*> \verbatim
+*> N1 is INTEGER
+*> N1 specifies the 2 x 2 block partition, the first N1 columns are
+*> rotated 'against' the remaining N-N1 columns of A.
+*> \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 N1, 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 N1, 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 Contributors:
+* ==================
+*>
+*> Zlatko Drmac (Zagreb, Croatia) and Kresimir Veselic (Hagen, Germany)
*
-* -- Contributed by Zlatko Drmac of the University of Zagreb and --
-* -- Kresimir Veselic of the Fernuniversitaet Hagen --
-* -- June 2010 --
+* =====================================================================
+ SUBROUTINE DGSVJ1( JOBV, M, N, N1, 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, --
* -- 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 ..
DOUBLE PRECISION EPS, SFMIN, TOL
INTEGER INFO, LDA, LDV, LWORK, M, MV, N, N1, NSWEEP
@@ -24,161 +245,30 @@
* ..
* .. Array Arguments ..
DOUBLE PRECISION A( LDA, * ), D( N ), SVA( N ), V( LDV, * ),
- + WORK( LWORK )
+ $ WORK( LWORK )
* ..
*
-* Purpose
-* =======
-*
-* DGSVJ1 is called from SGESVJ as a pre-processor and that is its main
-* purpose. It applies Jacobi rotations in the same way as SGESVJ does, but
-* it targets only particular pivots and it does not check convergence
-* (stopping criterion). Few tunning parameters (marked by [TP]) are
-* available for the implementer.
-*
-* Further Details
-* ~~~~~~~~~~~~~~~
-* DGSVJ1 applies few sweeps of Jacobi rotations in the column space of
-* the input M-by-N matrix A. The pivot pairs are taken from the (1,2)
-* off-diagonal block in the corresponding N-by-N Gram matrix A^T * A. The
-* block-entries (tiles) of the (1,2) off-diagonal block are marked by the
-* [x]'s in the following scheme:
-*
-* | * * * [x] [x] [x]|
-* | * * * [x] [x] [x]| Row-cycling in the nblr-by-nblc [x] blocks.
-* | * * * [x] [x] [x]| Row-cyclic pivoting inside each [x] block.
-* |[x] [x] [x] * * * |
-* |[x] [x] [x] * * * |
-* |[x] [x] [x] * * * |
-*
-* In terms of the columns of A, the first N1 columns are rotated 'against'
-* the remaining N-N1 columns, trying to increase the angle between the
-* corresponding subspaces. The off-diagonal block is N1-by(N-N1) and it is
-* tiled using quadratic tiles of side KBL. Here, KBL is a tunning parmeter.
-* The number of sweeps is given in NSWEEP and the orthogonality threshold
-* is given in TOL.
-*
-* Contributors
-* ~~~~~~~~~~~~
-* Zlatko Drmac (Zagreb, Croatia) and Kresimir Veselic (Hagen, Germany)
-*
-* 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.
-*
-* N1 (input) INTEGER
-* N1 specifies the 2 x 2 block partition, the first N1 columns are
-* rotated 'against' the remaining N-N1 columns of A.
-*
-* 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 N1, 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 N1, 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 ..
- DOUBLE PRECISION ZERO, HALF, ONE, TWO
- PARAMETER ( ZERO = 0.0D0, HALF = 0.5D0, ONE = 1.0D0,
- + TWO = 2.0D0 )
+ DOUBLE PRECISION ZERO, HALF, ONE
+ PARAMETER ( ZERO = 0.0D0, HALF = 0.5D0, ONE = 1.0D0 )
* ..
* .. Local Scalars ..
DOUBLE PRECISION AAPP, AAPP0, AAPQ, AAQQ, APOAQ, AQOAP, BIG,
- + BIGTHETA, CS, LARGE, MXAAPQ, MXSINJ, ROOTBIG,
- + ROOTEPS, ROOTSFMIN, ROOTTOL, SMALL, SN, T,
- + TEMP1, THETA, THSIGN
+ $ BIGTHETA, CS, LARGE, MXAAPQ, MXSINJ, ROOTBIG,
+ $ ROOTEPS, ROOTSFMIN, ROOTTOL, SMALL, SN, T,
+ $ TEMP1, THETA, THSIGN
INTEGER BLSKIP, EMPTSW, i, ibr, igl, IERR, IJBLSK,
- + ISWROT, jbc, jgl, KBL, MVL, NOTROT, nblc, nblr,
- + p, PSKIPPED, q, ROWSKIP, SWBAND
+ $ ISWROT, jbc, jgl, KBL, MVL, NOTROT, nblc, nblr,
+ $ p, PSKIPPED, q, ROWSKIP, SWBAND
LOGICAL APPLV, ROTOK, RSVEC
* ..
* .. Local Arrays ..
DOUBLE PRECISION FASTR( 5 )
* ..
* .. Intrinsic Functions ..
- INTRINSIC DABS, DMAX1, DBLE, MIN0, DSIGN, DSQRT
+ INTRINSIC DABS, MAX, DBLE, MIN, DSIGN, DSQRT
* ..
* .. External Functions ..
DOUBLE PRECISION DDOT, DNRM2
@@ -187,7 +277,8 @@
EXTERNAL IDAMAX, LSAME, DDOT, DNRM2
* ..
* .. External Subroutines ..
- EXTERNAL DAXPY, DCOPY, DLASCL, DLASSQ, DROTM, DSWAP
+ EXTERNAL DAXPY, DCOPY, DLASCL, DLASSQ, DROTM, DSWAP,
+ $ XERBLA
* ..
* .. Executable Statements ..
*
@@ -205,9 +296,10 @@
INFO = -4
ELSE IF( LDA.LT.M ) THEN
INFO = -6
- ELSE IF( MV.LT.0 ) THEN
+ ELSE IF( ( RSVEC.OR.APPLV ) .AND. ( MV.LT.0 ) ) THEN
INFO = -9
- ELSE IF( LDV.LT.M ) THEN
+ ELSE IF( ( RSVEC.AND.( LDV.LT.N ) ).OR.
+ $ ( APPLV.AND.( LDV.LT.MV ) ) ) THEN
INFO = -11
ELSE IF( TOL.LE.EPS ) THEN
INFO = -14
@@ -251,7 +343,7 @@
*
* .. Row-cyclic pivot strategy with de Rijk's pivoting ..
*
- KBL = MIN0( 8, N )
+ KBL = MIN( 8, N )
NBLR = N1 / KBL
IF( ( NBLR*KBL ).NE.N1 )NBLR = NBLR + 1
@@ -262,7 +354,7 @@
BLSKIP = ( KBL**2 ) + 1
*[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.
SWBAND = 0
*[TP] SWBAND is a tuning parameter. It is meaningful and effective
@@ -305,7 +397,7 @@
* doing the block at ( ibr, jbc )
IJBLSK = 0
- DO 2100 p = igl, MIN0( igl+KBL-1, N1 )
+ DO 2100 p = igl, MIN( igl+KBL-1, N1 )
AAPP = SVA( p )
@@ -313,7 +405,7 @@
PSKIPPED = 0
- DO 2200 q = jgl, MIN0( jgl+KBL-1, N )
+ DO 2200 q = jgl, MIN( jgl+KBL-1, N )
*
AAQQ = SVA( q )
@@ -332,14 +424,14 @@
END IF
IF( AAPP.LT.( BIG / AAQQ ) ) THEN
AAPQ = ( DDOT( M, A( 1, p ), 1, A( 1,
- + q ), 1 )*D( p )*D( q ) / AAQQ )
- + / AAPP
+ $ q ), 1 )*D( p )*D( q ) / AAQQ )
+ $ / AAPP
ELSE
CALL DCOPY( M, A( 1, p ), 1, WORK, 1 )
CALL DLASCL( 'G', 0, 0, AAPP, D( p ),
- + M, 1, WORK, LDA, IERR )
+ $ M, 1, WORK, LDA, IERR )
AAPQ = DDOT( M, WORK, 1, A( 1, q ),
- + 1 )*D( q ) / AAQQ
+ $ 1 )*D( q ) / AAQQ
END IF
ELSE
IF( AAPP.GE.AAQQ ) THEN
@@ -349,18 +441,18 @@
END IF
IF( AAPP.GT.( SMALL / AAQQ ) ) THEN
AAPQ = ( DDOT( M, A( 1, p ), 1, A( 1,
- + q ), 1 )*D( p )*D( q ) / AAQQ )
- + / AAPP
+ $ q ), 1 )*D( p )*D( q ) / AAQQ )
+ $ / AAPP
ELSE
CALL DCOPY( M, A( 1, q ), 1, WORK, 1 )
CALL DLASCL( 'G', 0, 0, AAQQ, D( q ),
- + M, 1, WORK, LDA, IERR )
+ $ M, 1, WORK, LDA, IERR )
AAPQ = DDOT( M, WORK, 1, A( 1, p ),
- + 1 )*D( p ) / AAPP
+ $ 1 )*D( p ) / AAPP
END IF
END IF
- MXAAPQ = DMAX1( MXAAPQ, DABS( AAPQ ) )
+ MXAAPQ = MAX( MXAAPQ, DABS( AAPQ ) )
* TO rotate or NOT to rotate, THAT is the question ...
*
@@ -374,8 +466,7 @@
*
AQOAP = AAQQ / AAPP
APOAQ = AAPP / AAQQ
- THETA = -HALF*DABS( AQOAP-APOAQ ) /
- + AAPQ
+ THETA = -HALF*DABS(AQOAP-APOAQ) / AAPQ
IF( AAQQ.GT.AAPP0 )THETA = -THETA
IF( DABS( THETA ).GT.BIGTHETA ) THEN
@@ -383,16 +474,16 @@
FASTR( 3 ) = T*D( p ) / D( q )
FASTR( 4 ) = -T*D( q ) / D( p )
CALL DROTM( M, A( 1, p ), 1,
- + A( 1, q ), 1, FASTR )
+ $ A( 1, q ), 1, FASTR )
IF( RSVEC )CALL DROTM( MVL,
- + V( 1, p ), 1,
- + V( 1, q ), 1,
- + FASTR )
- SVA( q ) = AAQQ*DSQRT( DMAX1( ZERO,
- + ONE+T*APOAQ*AAPQ ) )
- AAPP = AAPP*DSQRT( DMAX1( ZERO,
- + ONE-T*AQOAP*AAPQ ) )
- MXSINJ = DMAX1( MXSINJ, DABS( T ) )
+ $ V( 1, p ), 1,
+ $ V( 1, q ), 1,
+ $ FASTR )
+ SVA( q ) = AAQQ*DSQRT( MAX( ZERO,
+ $ ONE+T*APOAQ*AAPQ ) )
+ AAPP = AAPP*DSQRT( MAX( ZERO,
+ $ ONE-T*AQOAP*AAPQ ) )
+ MXSINJ = MAX( MXSINJ, DABS( T ) )
ELSE
*
* .. choose correct signum for THETA and rotate
@@ -400,14 +491,14 @@
THSIGN = -DSIGN( ONE, AAPQ )
IF( AAQQ.GT.AAPP0 )THSIGN = -THSIGN
T = ONE / ( THETA+THSIGN*
- + DSQRT( ONE+THETA*THETA ) )
+ $ DSQRT( ONE+THETA*THETA ) )
CS = DSQRT( ONE / ( ONE+T*T ) )
SN = T*CS
- MXSINJ = DMAX1( MXSINJ, DABS( SN ) )
- SVA( q ) = AAQQ*DSQRT( DMAX1( ZERO,
- + ONE+T*APOAQ*AAPQ ) )
- AAPP = AAPP*DSQRT( ONE-T*AQOAP*
- + AAPQ )
+ MXSINJ = MAX( MXSINJ, DABS( SN ) )
+ SVA( q ) = AAQQ*DSQRT( MAX( ZERO,
+ $ ONE+T*APOAQ*AAPQ ) )
+ AAPP = AAPP*DSQRT( MAX( ZERO,
+ $ ONE-T*AQOAP*AAPQ ) )
APOAQ = D( p ) / D( q )
AQOAP = D( q ) / D( p )
@@ -419,26 +510,26 @@
D( p ) = D( p )*CS
D( q ) = D( q )*CS
CALL DROTM( M, A( 1, p ), 1,
- + A( 1, q ), 1,
- + FASTR )
+ $ A( 1, q ), 1,
+ $ FASTR )
IF( RSVEC )CALL DROTM( MVL,
- + V( 1, p ), 1, V( 1, q ),
- + 1, FASTR )
+ $ V( 1, p ), 1, V( 1, q ),
+ $ 1, FASTR )
ELSE
CALL DAXPY( M, -T*AQOAP,
- + A( 1, q ), 1,
- + A( 1, p ), 1 )
+ $ A( 1, q ), 1,
+ $ A( 1, p ), 1 )
CALL DAXPY( M, CS*SN*APOAQ,
- + A( 1, p ), 1,
- + A( 1, q ), 1 )
+ $ A( 1, p ), 1,
+ $ A( 1, q ), 1 )
IF( RSVEC ) THEN
CALL DAXPY( MVL, -T*AQOAP,
- + V( 1, q ), 1,
- + V( 1, p ), 1 )
+ $ V( 1, q ), 1,
+ $ V( 1, p ), 1 )
CALL DAXPY( MVL,
- + CS*SN*APOAQ,
- + V( 1, p ), 1,
- + V( 1, q ), 1 )
+ $ CS*SN*APOAQ,
+ $ V( 1, p ), 1,
+ $ V( 1, q ), 1 )
END IF
D( p ) = D( p )*CS
D( q ) = D( q ) / CS
@@ -446,60 +537,60 @@
ELSE
IF( D( q ).GE.ONE ) THEN
CALL DAXPY( M, T*APOAQ,
- + A( 1, p ), 1,
- + A( 1, q ), 1 )
+ $ A( 1, p ), 1,
+ $ A( 1, q ), 1 )
CALL DAXPY( M, -CS*SN*AQOAP,
- + A( 1, q ), 1,
- + A( 1, p ), 1 )
+ $ A( 1, q ), 1,
+ $ A( 1, p ), 1 )
IF( RSVEC ) THEN
CALL DAXPY( MVL, T*APOAQ,
- + V( 1, p ), 1,
- + V( 1, q ), 1 )
+ $ V( 1, p ), 1,
+ $ V( 1, q ), 1 )
CALL DAXPY( MVL,
- + -CS*SN*AQOAP,
- + V( 1, q ), 1,
- + V( 1, p ), 1 )
+ $ -CS*SN*AQOAP,
+ $ V( 1, q ), 1,
+ $ V( 1, p ), 1 )
END IF
D( p ) = D( p ) / CS
D( q ) = D( q )*CS
ELSE
IF( D( p ).GE.D( q ) ) THEN
CALL DAXPY( M, -T*AQOAP,
- + A( 1, q ), 1,
- + A( 1, p ), 1 )
+ $ A( 1, q ), 1,
+ $ A( 1, p ), 1 )
CALL DAXPY( M, CS*SN*APOAQ,
- + A( 1, p ), 1,
- + A( 1, q ), 1 )
+ $ A( 1, p ), 1,
+ $ A( 1, q ), 1 )
D( p ) = D( p )*CS
D( q ) = D( q ) / CS
IF( RSVEC ) THEN
CALL DAXPY( MVL,
- + -T*AQOAP,
- + V( 1, q ), 1,
- + V( 1, p ), 1 )
+ $ -T*AQOAP,
+ $ V( 1, q ), 1,
+ $ V( 1, p ), 1 )
CALL DAXPY( MVL,
- + CS*SN*APOAQ,
- + V( 1, p ), 1,
- + V( 1, q ), 1 )
+ $ CS*SN*APOAQ,
+ $ V( 1, p ), 1,
+ $ V( 1, q ), 1 )
END IF
ELSE
CALL DAXPY( M, T*APOAQ,
- + A( 1, p ), 1,
- + A( 1, q ), 1 )
+ $ A( 1, p ), 1,
+ $ A( 1, q ), 1 )
CALL DAXPY( M,
- + -CS*SN*AQOAP,
- + A( 1, q ), 1,
- + A( 1, p ), 1 )
+ $ -CS*SN*AQOAP,
+ $ A( 1, q ), 1,
+ $ A( 1, p ), 1 )
D( p ) = D( p ) / CS
D( q ) = D( q )*CS
IF( RSVEC ) THEN
CALL DAXPY( MVL,
- + T*APOAQ, V( 1, p ),
- + 1, V( 1, q ), 1 )
+ $ T*APOAQ, V( 1, p ),
+ $ 1, V( 1, q ), 1 )
CALL DAXPY( MVL,
- + -CS*SN*AQOAP,
- + V( 1, q ), 1,
- + V( 1, p ), 1 )
+ $ -CS*SN*AQOAP,
+ $ V( 1, q ), 1,
+ $ V( 1, p ), 1 )
END IF
END IF
END IF
@@ -509,38 +600,38 @@
ELSE
IF( AAPP.GT.AAQQ ) THEN
CALL DCOPY( M, A( 1, p ), 1, WORK,
- + 1 )
+ $ 1 )
CALL DLASCL( 'G', 0, 0, AAPP, ONE,
- + M, 1, WORK, LDA, IERR )
+ $ M, 1, WORK, LDA, IERR )
CALL DLASCL( 'G', 0, 0, AAQQ, ONE,
- + M, 1, A( 1, q ), LDA,
- + IERR )
+ $ M, 1, A( 1, q ), LDA,
+ $ IERR )
TEMP1 = -AAPQ*D( p ) / D( q )
CALL DAXPY( M, TEMP1, WORK, 1,
- + A( 1, q ), 1 )
+ $ A( 1, q ), 1 )
CALL DLASCL( 'G', 0, 0, ONE, AAQQ,
- + M, 1, A( 1, q ), LDA,
- + IERR )
- SVA( q ) = AAQQ*DSQRT( DMAX1( ZERO,
- + ONE-AAPQ*AAPQ ) )
- MXSINJ = DMAX1( MXSINJ, SFMIN )
+ $ M, 1, A( 1, q ), LDA,
+ $ IERR )
+ SVA( q ) = AAQQ*DSQRT( MAX( ZERO,
+ $ ONE-AAPQ*AAPQ ) )
+ MXSINJ = MAX( MXSINJ, SFMIN )
ELSE
CALL DCOPY( M, A( 1, q ), 1, WORK,
- + 1 )
+ $ 1 )
CALL DLASCL( 'G', 0, 0, AAQQ, ONE,
- + M, 1, WORK, LDA, IERR )
+ $ M, 1, WORK, LDA, IERR )
CALL DLASCL( 'G', 0, 0, AAPP, ONE,
- + M, 1, A( 1, p ), LDA,
- + IERR )
+ $ M, 1, A( 1, p ), LDA,
+ $ IERR )
TEMP1 = -AAPQ*D( q ) / D( p )
CALL DAXPY( M, TEMP1, WORK, 1,
- + A( 1, p ), 1 )
+ $ A( 1, p ), 1 )
CALL DLASCL( 'G', 0, 0, ONE, AAPP,
- + M, 1, A( 1, p ), LDA,
- + IERR )
- SVA( p ) = AAPP*DSQRT( DMAX1( ZERO,
- + ONE-AAPQ*AAPQ ) )
- MXSINJ = DMAX1( MXSINJ, SFMIN )
+ $ M, 1, A( 1, p ), LDA,
+ $ IERR )
+ SVA( p ) = AAPP*DSQRT( MAX( ZERO,
+ $ ONE-AAPQ*AAPQ ) )
+ MXSINJ = MAX( MXSINJ, SFMIN )
END IF
END IF
* END IF ROTOK THEN ... ELSE
@@ -548,29 +639,29 @@
* In the case of cancellation in updating SVA(q)
* .. recompute SVA(q)
IF( ( SVA( q ) / AAQQ )**2.LE.ROOTEPS )
- + THEN
+ $ THEN
IF( ( AAQQ.LT.ROOTBIG ) .AND.
- + ( AAQQ.GT.ROOTSFMIN ) ) THEN
+ $ ( AAQQ.GT.ROOTSFMIN ) ) THEN
SVA( q ) = DNRM2( M, A( 1, q ), 1 )*
- + D( q )
+ $ D( q )
ELSE
T = ZERO
- AAQQ = ZERO
+ AAQQ = ONE
CALL DLASSQ( M, A( 1, q ), 1, T,
- + AAQQ )
+ $ AAQQ )
SVA( q ) = T*DSQRT( AAQQ )*D( q )
END IF
END IF
IF( ( AAPP / AAPP0 )**2.LE.ROOTEPS ) THEN
IF( ( AAPP.LT.ROOTBIG ) .AND.
- + ( AAPP.GT.ROOTSFMIN ) ) THEN
+ $ ( AAPP.GT.ROOTSFMIN ) ) THEN
AAPP = DNRM2( M, A( 1, p ), 1 )*
- + D( p )
+ $ D( p )
ELSE
T = ZERO
- AAPP = ZERO
+ AAPP = ONE
CALL DLASSQ( M, A( 1, p ), 1, T,
- + AAPP )
+ $ AAPP )
AAPP = T*DSQRT( AAPP )*D( p )
END IF
SVA( p ) = AAPP
@@ -590,13 +681,13 @@
* IF ( NOTROT .GE. EMPTSW ) GO TO 2011
IF( ( i.LE.SWBAND ) .AND. ( IJBLSK.GE.BLSKIP ) )
- + THEN
+ $ THEN
SVA( p ) = AAPP
NOTROT = 0
GO TO 2011
END IF
IF( ( i.LE.SWBAND ) .AND.
- + ( PSKIPPED.GT.ROWSKIP ) ) THEN
+ $ ( PSKIPPED.GT.ROWSKIP ) ) THEN
AAPP = -AAPP
NOTROT = 0
GO TO 2203
@@ -611,7 +702,7 @@
*
ELSE
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 ( NOTROT .GE. EMPTSW ) GO TO 2011
END IF
@@ -622,7 +713,7 @@
* end of the jbc-loop
2011 CONTINUE
*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 ) )
2012 CONTINUE
*** IF ( NOTROT .GE. EMPTSW ) GO TO 1994
@@ -631,11 +722,11 @@
*
* .. update SVA(N)
IF( ( SVA( N ).LT.ROOTBIG ) .AND. ( SVA( N ).GT.ROOTSFMIN ) )
- + THEN
+ $ THEN
SVA( N ) = DNRM2( M, A( 1, N ), 1 )*D( N )
ELSE
T = ZERO
- AAPP = ZERO
+ AAPP = ONE
CALL DLASSQ( M, A( 1, N ), 1, T, AAPP )
SVA( N ) = T*DSQRT( AAPP )*D( N )
END IF
@@ -643,10 +734,10 @@
* Additional steering devices
*
IF( ( i.LT.SWBAND ) .AND. ( ( MXAAPQ.LE.ROOTTOL ) .OR.
- + ( ISWROT.LE.N ) ) )SWBAND = i
+ $ ( ISWROT.LE.N ) ) )SWBAND = i
IF( ( i.GT.SWBAND+1 ) .AND. ( MXAAPQ.LT.DBLE( N )*TOL ) .AND.
- + ( DBLE( N )*MXAAPQ*MXSINJ.LT.TOL ) ) THEN
+ $ ( DBLE( N )*MXAAPQ*MXSINJ.LT.TOL ) ) THEN
GO TO 1994
END IF