Cloned library LAPACK-3.11.0 with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

514 lines
22 KiB

*> \brief \b DGET31
*
* =========== DOCUMENTATION ===========
*
* Online html documentation available at
* http://www.netlib.org/lapack/explore-html/
*
* Definition:
* ===========
*
* SUBROUTINE DGET31( RMAX, LMAX, NINFO, KNT )
*
* .. Scalar Arguments ..
* INTEGER KNT, LMAX
* DOUBLE PRECISION RMAX
* ..
* .. Array Arguments ..
* INTEGER NINFO( 2 )
* ..
*
*
*> \par Purpose:
* =============
*>
*> \verbatim
*>
*> DGET31 tests DLALN2, a routine for solving
*>
*> (ca A - w D)X = sB
*>
*> where A is an NA by NA matrix (NA=1 or 2 only), w is a real (NW=1) or
*> complex (NW=2) constant, ca is a real constant, D is an NA by NA real
*> diagonal matrix, and B is an NA by NW matrix (when NW=2 the second
*> column of B contains the imaginary part of the solution). The code
*> returns X and s, where s is a scale factor, less than or equal to 1,
*> which is chosen to avoid overflow in X.
*>
*> If any singular values of ca A-w D are less than another input
*> parameter SMIN, they are perturbed up to SMIN.
*>
*> The test condition is that the scaled residual
*>
*> norm( (ca A-w D)*X - s*B ) /
*> ( max( ulp*norm(ca A-w D), SMIN )*norm(X) )
*>
*> should be on the order of 1. Here, ulp is the machine precision.
*> Also, it is verified that SCALE is less than or equal to 1, and that
*> XNORM = infinity-norm(X).
*> \endverbatim
*
* Arguments:
* ==========
*
*> \param[out] RMAX
*> \verbatim
*> RMAX is DOUBLE PRECISION
*> Value of the largest test ratio.
*> \endverbatim
*>
*> \param[out] LMAX
*> \verbatim
*> LMAX is INTEGER
*> Example number where largest test ratio achieved.
*> \endverbatim
*>
*> \param[out] NINFO
*> \verbatim
*> NINFO is INTEGER array, dimension (2)
*> NINFO(1) = number of examples with INFO less than 0
*> NINFO(2) = number of examples with INFO greater than 0
*> \endverbatim
*>
*> \param[out] KNT
*> \verbatim
*> KNT is INTEGER
*> Total number of examples tested.
*> \endverbatim
*
* Authors:
* ========
*
*> \author Univ. of Tennessee
*> \author Univ. of California Berkeley
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
*> \ingroup double_eig
*
* =====================================================================
SUBROUTINE DGET31( RMAX, LMAX, NINFO, KNT )
*
* -- LAPACK test routine --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
*
* .. Scalar Arguments ..
INTEGER KNT, LMAX
DOUBLE PRECISION RMAX
* ..
* .. Array Arguments ..
INTEGER NINFO( 2 )
* ..
*
* =====================================================================
*
* .. Parameters ..
DOUBLE PRECISION ZERO, HALF, ONE
PARAMETER ( ZERO = 0.0D0, HALF = 0.5D0, ONE = 1.0D0 )
DOUBLE PRECISION TWO, THREE, FOUR
PARAMETER ( TWO = 2.0D0, THREE = 3.0D0, FOUR = 4.0D0 )
DOUBLE PRECISION SEVEN, TEN
PARAMETER ( SEVEN = 7.0D0, TEN = 10.0D0 )
DOUBLE PRECISION TWNONE
PARAMETER ( TWNONE = 21.0D0 )
* ..
* .. Local Scalars ..
INTEGER IA, IB, ICA, ID1, ID2, INFO, ISMIN, ITRANS,
$ IWI, IWR, NA, NW
DOUBLE PRECISION BIGNUM, CA, D1, D2, DEN, EPS, RES, SCALE, SMIN,
$ SMLNUM, TMP, UNFL, WI, WR, XNORM
* ..
* .. Local Arrays ..
LOGICAL LTRANS( 0: 1 )
DOUBLE PRECISION A( 2, 2 ), B( 2, 2 ), VAB( 3 ), VCA( 5 ),
$ VDD( 4 ), VSMIN( 4 ), VWI( 4 ), VWR( 4 ),
$ X( 2, 2 )
* ..
* .. External Functions ..
DOUBLE PRECISION DLAMCH
EXTERNAL DLAMCH
* ..
* .. External Subroutines ..
EXTERNAL DLALN2
* ..
* .. Intrinsic Functions ..
INTRINSIC ABS, MAX, SQRT
* ..
* .. Data statements ..
DATA LTRANS / .FALSE., .TRUE. /
* ..
* .. Executable Statements ..
*
* Get machine parameters
*
EPS = DLAMCH( 'P' )
UNFL = DLAMCH( 'U' )
SMLNUM = DLAMCH( 'S' ) / EPS
BIGNUM = ONE / SMLNUM
*
* Set up test case parameters
*
VSMIN( 1 ) = SMLNUM
VSMIN( 2 ) = EPS
VSMIN( 3 ) = ONE / ( TEN*TEN )
VSMIN( 4 ) = ONE / EPS
VAB( 1 ) = SQRT( SMLNUM )
VAB( 2 ) = ONE
VAB( 3 ) = SQRT( BIGNUM )
VWR( 1 ) = ZERO
VWR( 2 ) = HALF
VWR( 3 ) = TWO
VWR( 4 ) = ONE
VWI( 1 ) = SMLNUM
VWI( 2 ) = EPS
VWI( 3 ) = ONE
VWI( 4 ) = TWO
VDD( 1 ) = SQRT( SMLNUM )
VDD( 2 ) = ONE
VDD( 3 ) = TWO
VDD( 4 ) = SQRT( BIGNUM )
VCA( 1 ) = ZERO
VCA( 2 ) = SQRT( SMLNUM )
VCA( 3 ) = EPS
VCA( 4 ) = HALF
VCA( 5 ) = ONE
*
KNT = 0
NINFO( 1 ) = 0
NINFO( 2 ) = 0
LMAX = 0
RMAX = ZERO
*
* Begin test loop
*
DO 190 ID1 = 1, 4
D1 = VDD( ID1 )
DO 180 ID2 = 1, 4
D2 = VDD( ID2 )
DO 170 ICA = 1, 5
CA = VCA( ICA )
DO 160 ITRANS = 0, 1
DO 150 ISMIN = 1, 4
SMIN = VSMIN( ISMIN )
*
NA = 1
NW = 1
DO 30 IA = 1, 3
A( 1, 1 ) = VAB( IA )
DO 20 IB = 1, 3
B( 1, 1 ) = VAB( IB )
DO 10 IWR = 1, 4
IF( D1.EQ.ONE .AND. D2.EQ.ONE .AND. CA.EQ.
$ ONE ) THEN
WR = VWR( IWR )*A( 1, 1 )
ELSE
WR = VWR( IWR )
END IF
WI = ZERO
CALL DLALN2( LTRANS( ITRANS ), NA, NW,
$ SMIN, CA, A, 2, D1, D2, B, 2,
$ WR, WI, X, 2, SCALE, XNORM,
$ INFO )
IF( INFO.LT.0 )
$ NINFO( 1 ) = NINFO( 1 ) + 1
IF( INFO.GT.0 )
$ NINFO( 2 ) = NINFO( 2 ) + 1
RES = ABS( ( CA*A( 1, 1 )-WR*D1 )*
$ X( 1, 1 )-SCALE*B( 1, 1 ) )
IF( INFO.EQ.0 ) THEN
DEN = MAX( EPS*( ABS( ( CA*A( 1,
$ 1 )-WR*D1 )*X( 1, 1 ) ) ),
$ SMLNUM )
ELSE
DEN = MAX( SMIN*ABS( X( 1, 1 ) ),
$ SMLNUM )
END IF
RES = RES / DEN
IF( ABS( X( 1, 1 ) ).LT.UNFL .AND.
$ ABS( B( 1, 1 ) ).LE.SMLNUM*
$ ABS( CA*A( 1, 1 )-WR*D1 ) )RES = ZERO
IF( SCALE.GT.ONE )
$ RES = RES + ONE / EPS
RES = RES + ABS( XNORM-ABS( X( 1, 1 ) ) )
$ / MAX( SMLNUM, XNORM ) / EPS
IF( INFO.NE.0 .AND. INFO.NE.1 )
$ RES = RES + ONE / EPS
KNT = KNT + 1
IF( RES.GT.RMAX ) THEN
LMAX = KNT
RMAX = RES
END IF
10 CONTINUE
20 CONTINUE
30 CONTINUE
*
NA = 1
NW = 2
DO 70 IA = 1, 3
A( 1, 1 ) = VAB( IA )
DO 60 IB = 1, 3
B( 1, 1 ) = VAB( IB )
B( 1, 2 ) = -HALF*VAB( IB )
DO 50 IWR = 1, 4
IF( D1.EQ.ONE .AND. D2.EQ.ONE .AND. CA.EQ.
$ ONE ) THEN
WR = VWR( IWR )*A( 1, 1 )
ELSE
WR = VWR( IWR )
END IF
DO 40 IWI = 1, 4
IF( D1.EQ.ONE .AND. D2.EQ.ONE .AND.
$ CA.EQ.ONE ) THEN
WI = VWI( IWI )*A( 1, 1 )
ELSE
WI = VWI( IWI )
END IF
CALL DLALN2( LTRANS( ITRANS ), NA, NW,
$ SMIN, CA, A, 2, D1, D2, B,
$ 2, WR, WI, X, 2, SCALE,
$ XNORM, INFO )
IF( INFO.LT.0 )
$ NINFO( 1 ) = NINFO( 1 ) + 1
IF( INFO.GT.0 )
$ NINFO( 2 ) = NINFO( 2 ) + 1
RES = ABS( ( CA*A( 1, 1 )-WR*D1 )*
$ X( 1, 1 )+( WI*D1 )*X( 1, 2 )-
$ SCALE*B( 1, 1 ) )
RES = RES + ABS( ( -WI*D1 )*X( 1, 1 )+
$ ( CA*A( 1, 1 )-WR*D1 )*X( 1, 2 )-
$ SCALE*B( 1, 2 ) )
IF( INFO.EQ.0 ) THEN
DEN = MAX( EPS*( MAX( ABS( CA*A( 1,
$ 1 )-WR*D1 ), ABS( D1*WI ) )*
$ ( ABS( X( 1, 1 ) )+ABS( X( 1,
$ 2 ) ) ) ), SMLNUM )
ELSE
DEN = MAX( SMIN*( ABS( X( 1,
$ 1 ) )+ABS( X( 1, 2 ) ) ),
$ SMLNUM )
END IF
RES = RES / DEN
IF( ABS( X( 1, 1 ) ).LT.UNFL .AND.
$ ABS( X( 1, 2 ) ).LT.UNFL .AND.
$ ABS( B( 1, 1 ) ).LE.SMLNUM*
$ ABS( CA*A( 1, 1 )-WR*D1 ) )
$ RES = ZERO
IF( SCALE.GT.ONE )
$ RES = RES + ONE / EPS
RES = RES + ABS( XNORM-
$ ABS( X( 1, 1 ) )-
$ ABS( X( 1, 2 ) ) ) /
$ MAX( SMLNUM, XNORM ) / EPS
IF( INFO.NE.0 .AND. INFO.NE.1 )
$ RES = RES + ONE / EPS
KNT = KNT + 1
IF( RES.GT.RMAX ) THEN
LMAX = KNT
RMAX = RES
END IF
40 CONTINUE
50 CONTINUE
60 CONTINUE
70 CONTINUE
*
NA = 2
NW = 1
DO 100 IA = 1, 3
A( 1, 1 ) = VAB( IA )
A( 1, 2 ) = -THREE*VAB( IA )
A( 2, 1 ) = -SEVEN*VAB( IA )
A( 2, 2 ) = TWNONE*VAB( IA )
DO 90 IB = 1, 3
B( 1, 1 ) = VAB( IB )
B( 2, 1 ) = -TWO*VAB( IB )
DO 80 IWR = 1, 4
IF( D1.EQ.ONE .AND. D2.EQ.ONE .AND. CA.EQ.
$ ONE ) THEN
WR = VWR( IWR )*A( 1, 1 )
ELSE
WR = VWR( IWR )
END IF
WI = ZERO
CALL DLALN2( LTRANS( ITRANS ), NA, NW,
$ SMIN, CA, A, 2, D1, D2, B, 2,
$ WR, WI, X, 2, SCALE, XNORM,
$ INFO )
IF( INFO.LT.0 )
$ NINFO( 1 ) = NINFO( 1 ) + 1
IF( INFO.GT.0 )
$ NINFO( 2 ) = NINFO( 2 ) + 1
IF( ITRANS.EQ.1 ) THEN
TMP = A( 1, 2 )
A( 1, 2 ) = A( 2, 1 )
A( 2, 1 ) = TMP
END IF
RES = ABS( ( CA*A( 1, 1 )-WR*D1 )*
$ X( 1, 1 )+( CA*A( 1, 2 ) )*
$ X( 2, 1 )-SCALE*B( 1, 1 ) )
RES = RES + ABS( ( CA*A( 2, 1 ) )*
$ X( 1, 1 )+( CA*A( 2, 2 )-WR*D2 )*
$ X( 2, 1 )-SCALE*B( 2, 1 ) )
IF( INFO.EQ.0 ) THEN
DEN = MAX( EPS*( MAX( ABS( CA*A( 1,
$ 1 )-WR*D1 )+ABS( CA*A( 1, 2 ) ),
$ ABS( CA*A( 2, 1 ) )+ABS( CA*A( 2,
$ 2 )-WR*D2 ) )*MAX( ABS( X( 1,
$ 1 ) ), ABS( X( 2, 1 ) ) ) ),
$ SMLNUM )
ELSE
DEN = MAX( EPS*( MAX( SMIN / EPS,
$ MAX( ABS( CA*A( 1,
$ 1 )-WR*D1 )+ABS( CA*A( 1, 2 ) ),
$ ABS( CA*A( 2, 1 ) )+ABS( CA*A( 2,
$ 2 )-WR*D2 ) ) )*MAX( ABS( X( 1,
$ 1 ) ), ABS( X( 2, 1 ) ) ) ),
$ SMLNUM )
END IF
RES = RES / DEN
IF( ABS( X( 1, 1 ) ).LT.UNFL .AND.
$ ABS( X( 2, 1 ) ).LT.UNFL .AND.
$ ABS( B( 1, 1 ) )+ABS( B( 2, 1 ) ).LE.
$ SMLNUM*( ABS( CA*A( 1,
$ 1 )-WR*D1 )+ABS( CA*A( 1,
$ 2 ) )+ABS( CA*A( 2,
$ 1 ) )+ABS( CA*A( 2, 2 )-WR*D2 ) ) )
$ RES = ZERO
IF( SCALE.GT.ONE )
$ RES = RES + ONE / EPS
RES = RES + ABS( XNORM-
$ MAX( ABS( X( 1, 1 ) ), ABS( X( 2,
$ 1 ) ) ) ) / MAX( SMLNUM, XNORM ) /
$ EPS
IF( INFO.NE.0 .AND. INFO.NE.1 )
$ RES = RES + ONE / EPS
KNT = KNT + 1
IF( RES.GT.RMAX ) THEN
LMAX = KNT
RMAX = RES
END IF
80 CONTINUE
90 CONTINUE
100 CONTINUE
*
NA = 2
NW = 2
DO 140 IA = 1, 3
A( 1, 1 ) = VAB( IA )*TWO
A( 1, 2 ) = -THREE*VAB( IA )
A( 2, 1 ) = -SEVEN*VAB( IA )
A( 2, 2 ) = TWNONE*VAB( IA )
DO 130 IB = 1, 3
B( 1, 1 ) = VAB( IB )
B( 2, 1 ) = -TWO*VAB( IB )
B( 1, 2 ) = FOUR*VAB( IB )
B( 2, 2 ) = -SEVEN*VAB( IB )
DO 120 IWR = 1, 4
IF( D1.EQ.ONE .AND. D2.EQ.ONE .AND. CA.EQ.
$ ONE ) THEN
WR = VWR( IWR )*A( 1, 1 )
ELSE
WR = VWR( IWR )
END IF
DO 110 IWI = 1, 4
IF( D1.EQ.ONE .AND. D2.EQ.ONE .AND.
$ CA.EQ.ONE ) THEN
WI = VWI( IWI )*A( 1, 1 )
ELSE
WI = VWI( IWI )
END IF
CALL DLALN2( LTRANS( ITRANS ), NA, NW,
$ SMIN, CA, A, 2, D1, D2, B,
$ 2, WR, WI, X, 2, SCALE,
$ XNORM, INFO )
IF( INFO.LT.0 )
$ NINFO( 1 ) = NINFO( 1 ) + 1
IF( INFO.GT.0 )
$ NINFO( 2 ) = NINFO( 2 ) + 1
IF( ITRANS.EQ.1 ) THEN
TMP = A( 1, 2 )
A( 1, 2 ) = A( 2, 1 )
A( 2, 1 ) = TMP
END IF
RES = ABS( ( CA*A( 1, 1 )-WR*D1 )*
$ X( 1, 1 )+( CA*A( 1, 2 ) )*
$ X( 2, 1 )+( WI*D1 )*X( 1, 2 )-
$ SCALE*B( 1, 1 ) )
RES = RES + ABS( ( CA*A( 1,
$ 1 )-WR*D1 )*X( 1, 2 )+
$ ( CA*A( 1, 2 ) )*X( 2, 2 )-
$ ( WI*D1 )*X( 1, 1 )-SCALE*
$ B( 1, 2 ) )
RES = RES + ABS( ( CA*A( 2, 1 ) )*
$ X( 1, 1 )+( CA*A( 2, 2 )-WR*D2 )*
$ X( 2, 1 )+( WI*D2 )*X( 2, 2 )-
$ SCALE*B( 2, 1 ) )
RES = RES + ABS( ( CA*A( 2, 1 ) )*
$ X( 1, 2 )+( CA*A( 2, 2 )-WR*D2 )*
$ X( 2, 2 )-( WI*D2 )*X( 2, 1 )-
$ SCALE*B( 2, 2 ) )
IF( INFO.EQ.0 ) THEN
DEN = MAX( EPS*( MAX( ABS( CA*A( 1,
$ 1 )-WR*D1 )+ABS( CA*A( 1,
$ 2 ) )+ABS( WI*D1 ),
$ ABS( CA*A( 2,
$ 1 ) )+ABS( CA*A( 2,
$ 2 )-WR*D2 )+ABS( WI*D2 ) )*
$ MAX( ABS( X( 1,
$ 1 ) )+ABS( X( 2, 1 ) ),
$ ABS( X( 1, 2 ) )+ABS( X( 2,
$ 2 ) ) ) ), SMLNUM )
ELSE
DEN = MAX( EPS*( MAX( SMIN / EPS,
$ MAX( ABS( CA*A( 1,
$ 1 )-WR*D1 )+ABS( CA*A( 1,
$ 2 ) )+ABS( WI*D1 ),
$ ABS( CA*A( 2,
$ 1 ) )+ABS( CA*A( 2,
$ 2 )-WR*D2 )+ABS( WI*D2 ) ) )*
$ MAX( ABS( X( 1,
$ 1 ) )+ABS( X( 2, 1 ) ),
$ ABS( X( 1, 2 ) )+ABS( X( 2,
$ 2 ) ) ) ), SMLNUM )
END IF
RES = RES / DEN
IF( ABS( X( 1, 1 ) ).LT.UNFL .AND.
$ ABS( X( 2, 1 ) ).LT.UNFL .AND.
$ ABS( X( 1, 2 ) ).LT.UNFL .AND.
$ ABS( X( 2, 2 ) ).LT.UNFL .AND.
$ ABS( B( 1, 1 ) )+
$ ABS( B( 2, 1 ) ).LE.SMLNUM*
$ ( ABS( CA*A( 1, 1 )-WR*D1 )+
$ ABS( CA*A( 1, 2 ) )+ABS( CA*A( 2,
$ 1 ) )+ABS( CA*A( 2,
$ 2 )-WR*D2 )+ABS( WI*D2 )+ABS( WI*
$ D1 ) ) )RES = ZERO
IF( SCALE.GT.ONE )
$ RES = RES + ONE / EPS
RES = RES + ABS( XNORM-
$ MAX( ABS( X( 1, 1 ) )+ABS( X( 1,
$ 2 ) ), ABS( X( 2,
$ 1 ) )+ABS( X( 2, 2 ) ) ) ) /
$ MAX( SMLNUM, XNORM ) / EPS
IF( INFO.NE.0 .AND. INFO.NE.1 )
$ RES = RES + ONE / EPS
KNT = KNT + 1
IF( RES.GT.RMAX ) THEN
LMAX = KNT
RMAX = RES
END IF
110 CONTINUE
120 CONTINUE
130 CONTINUE
140 CONTINUE
150 CONTINUE
160 CONTINUE
170 CONTINUE
180 CONTINUE
190 CONTINUE
*
RETURN
*
* End of DGET31
*
END