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.
428 lines
18 KiB
428 lines
18 KiB
2 years ago
|
*> \brief \b DGET32
|
||
|
*
|
||
|
* =========== DOCUMENTATION ===========
|
||
|
*
|
||
|
* Online html documentation available at
|
||
|
* http://www.netlib.org/lapack/explore-html/
|
||
|
*
|
||
|
* Definition:
|
||
|
* ===========
|
||
|
*
|
||
|
* SUBROUTINE DGET32( RMAX, LMAX, NINFO, KNT )
|
||
|
*
|
||
|
* .. Scalar Arguments ..
|
||
|
* INTEGER KNT, LMAX, NINFO
|
||
|
* DOUBLE PRECISION RMAX
|
||
|
* ..
|
||
|
*
|
||
|
*
|
||
|
*> \par Purpose:
|
||
|
* =============
|
||
|
*>
|
||
|
*> \verbatim
|
||
|
*>
|
||
|
*> DGET32 tests DLASY2, a routine for solving
|
||
|
*>
|
||
|
*> op(TL)*X + ISGN*X*op(TR) = SCALE*B
|
||
|
*>
|
||
|
*> where TL is N1 by N1, TR is N2 by N2, and N1,N2 =1 or 2 only.
|
||
|
*> X and B are N1 by N2, op() is an optional transpose, an
|
||
|
*> ISGN = 1 or -1. SCALE is chosen less than or equal to 1 to
|
||
|
*> avoid overflow in X.
|
||
|
*>
|
||
|
*> The test condition is that the scaled residual
|
||
|
*>
|
||
|
*> norm( op(TL)*X + ISGN*X*op(TR) = SCALE*B )
|
||
|
*> / ( max( ulp*norm(TL), ulp*norm(TR)) * norm(X), SMLNUM )
|
||
|
*>
|
||
|
*> 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
|
||
|
*> Number of examples returned with INFO.NE.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 DGET32( 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, NINFO
|
||
|
DOUBLE PRECISION RMAX
|
||
|
* ..
|
||
|
*
|
||
|
* =====================================================================
|
||
|
*
|
||
|
* .. Parameters ..
|
||
|
DOUBLE PRECISION ZERO, ONE
|
||
|
PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 )
|
||
|
DOUBLE PRECISION TWO, FOUR, EIGHT
|
||
|
PARAMETER ( TWO = 2.0D0, FOUR = 4.0D0, EIGHT = 8.0D0 )
|
||
|
* ..
|
||
|
* .. Local Scalars ..
|
||
|
LOGICAL LTRANL, LTRANR
|
||
|
INTEGER IB, IB1, IB2, IB3, INFO, ISGN, ITL, ITLSCL,
|
||
|
$ ITR, ITRANL, ITRANR, ITRSCL, N1, N2
|
||
|
DOUBLE PRECISION BIGNUM, DEN, EPS, RES, SCALE, SGN, SMLNUM, TMP,
|
||
|
$ TNRM, XNORM, XNRM
|
||
|
* ..
|
||
|
* .. Local Arrays ..
|
||
|
INTEGER ITVAL( 2, 2, 8 )
|
||
|
DOUBLE PRECISION B( 2, 2 ), TL( 2, 2 ), TR( 2, 2 ), VAL( 3 ),
|
||
|
$ X( 2, 2 )
|
||
|
* ..
|
||
|
* .. External Functions ..
|
||
|
DOUBLE PRECISION DLAMCH
|
||
|
EXTERNAL DLAMCH
|
||
|
* ..
|
||
|
* .. External Subroutines ..
|
||
|
EXTERNAL DLASY2
|
||
|
* ..
|
||
|
* .. Intrinsic Functions ..
|
||
|
INTRINSIC ABS, MAX, MIN, SQRT
|
||
|
* ..
|
||
|
* .. Data statements ..
|
||
|
DATA ITVAL / 8, 4, 2, 1, 4, 8, 1, 2, 2, 1, 8, 4, 1,
|
||
|
$ 2, 4, 8, 9, 4, 2, 1, 4, 9, 1, 2, 2, 1, 9, 4, 1,
|
||
|
$ 2, 4, 9 /
|
||
|
* ..
|
||
|
* .. Executable Statements ..
|
||
|
*
|
||
|
* Get machine parameters
|
||
|
*
|
||
|
EPS = DLAMCH( 'P' )
|
||
|
SMLNUM = DLAMCH( 'S' ) / EPS
|
||
|
BIGNUM = ONE / SMLNUM
|
||
|
*
|
||
|
* Set up test case parameters
|
||
|
*
|
||
|
VAL( 1 ) = SQRT( SMLNUM )
|
||
|
VAL( 2 ) = ONE
|
||
|
VAL( 3 ) = SQRT( BIGNUM )
|
||
|
*
|
||
|
KNT = 0
|
||
|
NINFO = 0
|
||
|
LMAX = 0
|
||
|
RMAX = ZERO
|
||
|
*
|
||
|
* Begin test loop
|
||
|
*
|
||
|
DO 230 ITRANL = 0, 1
|
||
|
DO 220 ITRANR = 0, 1
|
||
|
DO 210 ISGN = -1, 1, 2
|
||
|
SGN = ISGN
|
||
|
LTRANL = ITRANL.EQ.1
|
||
|
LTRANR = ITRANR.EQ.1
|
||
|
*
|
||
|
N1 = 1
|
||
|
N2 = 1
|
||
|
DO 30 ITL = 1, 3
|
||
|
DO 20 ITR = 1, 3
|
||
|
DO 10 IB = 1, 3
|
||
|
TL( 1, 1 ) = VAL( ITL )
|
||
|
TR( 1, 1 ) = VAL( ITR )
|
||
|
B( 1, 1 ) = VAL( IB )
|
||
|
KNT = KNT + 1
|
||
|
CALL DLASY2( LTRANL, LTRANR, ISGN, N1, N2, TL,
|
||
|
$ 2, TR, 2, B, 2, SCALE, X, 2, XNORM,
|
||
|
$ INFO )
|
||
|
IF( INFO.NE.0 )
|
||
|
$ NINFO = NINFO + 1
|
||
|
RES = ABS( ( TL( 1, 1 )+SGN*TR( 1, 1 ) )*
|
||
|
$ X( 1, 1 )-SCALE*B( 1, 1 ) )
|
||
|
IF( INFO.EQ.0 ) THEN
|
||
|
DEN = MAX( EPS*( ( ABS( TR( 1,
|
||
|
$ 1 ) )+ABS( TL( 1, 1 ) ) )*ABS( X( 1,
|
||
|
$ 1 ) ) ), SMLNUM )
|
||
|
ELSE
|
||
|
DEN = SMLNUM*MAX( ABS( X( 1, 1 ) ), ONE )
|
||
|
END IF
|
||
|
RES = RES / DEN
|
||
|
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
|
||
|
IF( RES.GT.RMAX ) THEN
|
||
|
LMAX = KNT
|
||
|
RMAX = RES
|
||
|
END IF
|
||
|
10 CONTINUE
|
||
|
20 CONTINUE
|
||
|
30 CONTINUE
|
||
|
*
|
||
|
N1 = 2
|
||
|
N2 = 1
|
||
|
DO 80 ITL = 1, 8
|
||
|
DO 70 ITLSCL = 1, 3
|
||
|
DO 60 ITR = 1, 3
|
||
|
DO 50 IB1 = 1, 3
|
||
|
DO 40 IB2 = 1, 3
|
||
|
B( 1, 1 ) = VAL( IB1 )
|
||
|
B( 2, 1 ) = -FOUR*VAL( IB2 )
|
||
|
TL( 1, 1 ) = ITVAL( 1, 1, ITL )*
|
||
|
$ VAL( ITLSCL )
|
||
|
TL( 2, 1 ) = ITVAL( 2, 1, ITL )*
|
||
|
$ VAL( ITLSCL )
|
||
|
TL( 1, 2 ) = ITVAL( 1, 2, ITL )*
|
||
|
$ VAL( ITLSCL )
|
||
|
TL( 2, 2 ) = ITVAL( 2, 2, ITL )*
|
||
|
$ VAL( ITLSCL )
|
||
|
TR( 1, 1 ) = VAL( ITR )
|
||
|
KNT = KNT + 1
|
||
|
CALL DLASY2( LTRANL, LTRANR, ISGN, N1, N2,
|
||
|
$ TL, 2, TR, 2, B, 2, SCALE, X,
|
||
|
$ 2, XNORM, INFO )
|
||
|
IF( INFO.NE.0 )
|
||
|
$ NINFO = NINFO + 1
|
||
|
IF( LTRANL ) THEN
|
||
|
TMP = TL( 1, 2 )
|
||
|
TL( 1, 2 ) = TL( 2, 1 )
|
||
|
TL( 2, 1 ) = TMP
|
||
|
END IF
|
||
|
RES = ABS( ( TL( 1, 1 )+SGN*TR( 1, 1 ) )*
|
||
|
$ X( 1, 1 )+TL( 1, 2 )*X( 2, 1 )-
|
||
|
$ SCALE*B( 1, 1 ) )
|
||
|
RES = RES + ABS( ( TL( 2, 2 )+SGN*TR( 1,
|
||
|
$ 1 ) )*X( 2, 1 )+TL( 2, 1 )*
|
||
|
$ X( 1, 1 )-SCALE*B( 2, 1 ) )
|
||
|
TNRM = ABS( TR( 1, 1 ) ) +
|
||
|
$ ABS( TL( 1, 1 ) ) +
|
||
|
$ ABS( TL( 1, 2 ) ) +
|
||
|
$ ABS( TL( 2, 1 ) ) +
|
||
|
$ ABS( TL( 2, 2 ) )
|
||
|
XNRM = MAX( ABS( X( 1, 1 ) ),
|
||
|
$ ABS( X( 2, 1 ) ) )
|
||
|
DEN = MAX( SMLNUM, SMLNUM*XNRM,
|
||
|
$ ( TNRM*EPS )*XNRM )
|
||
|
RES = RES / DEN
|
||
|
IF( SCALE.GT.ONE )
|
||
|
$ RES = RES + ONE / EPS
|
||
|
RES = RES + ABS( XNORM-XNRM ) /
|
||
|
$ MAX( SMLNUM, XNORM ) / EPS
|
||
|
IF( RES.GT.RMAX ) THEN
|
||
|
LMAX = KNT
|
||
|
RMAX = RES
|
||
|
END IF
|
||
|
40 CONTINUE
|
||
|
50 CONTINUE
|
||
|
60 CONTINUE
|
||
|
70 CONTINUE
|
||
|
80 CONTINUE
|
||
|
*
|
||
|
N1 = 1
|
||
|
N2 = 2
|
||
|
DO 130 ITR = 1, 8
|
||
|
DO 120 ITRSCL = 1, 3
|
||
|
DO 110 ITL = 1, 3
|
||
|
DO 100 IB1 = 1, 3
|
||
|
DO 90 IB2 = 1, 3
|
||
|
B( 1, 1 ) = VAL( IB1 )
|
||
|
B( 1, 2 ) = -TWO*VAL( IB2 )
|
||
|
TR( 1, 1 ) = ITVAL( 1, 1, ITR )*
|
||
|
$ VAL( ITRSCL )
|
||
|
TR( 2, 1 ) = ITVAL( 2, 1, ITR )*
|
||
|
$ VAL( ITRSCL )
|
||
|
TR( 1, 2 ) = ITVAL( 1, 2, ITR )*
|
||
|
$ VAL( ITRSCL )
|
||
|
TR( 2, 2 ) = ITVAL( 2, 2, ITR )*
|
||
|
$ VAL( ITRSCL )
|
||
|
TL( 1, 1 ) = VAL( ITL )
|
||
|
KNT = KNT + 1
|
||
|
CALL DLASY2( LTRANL, LTRANR, ISGN, N1, N2,
|
||
|
$ TL, 2, TR, 2, B, 2, SCALE, X,
|
||
|
$ 2, XNORM, INFO )
|
||
|
IF( INFO.NE.0 )
|
||
|
$ NINFO = NINFO + 1
|
||
|
IF( LTRANR ) THEN
|
||
|
TMP = TR( 1, 2 )
|
||
|
TR( 1, 2 ) = TR( 2, 1 )
|
||
|
TR( 2, 1 ) = TMP
|
||
|
END IF
|
||
|
TNRM = ABS( TL( 1, 1 ) ) +
|
||
|
$ ABS( TR( 1, 1 ) ) +
|
||
|
$ ABS( TR( 1, 2 ) ) +
|
||
|
$ ABS( TR( 2, 2 ) ) +
|
||
|
$ ABS( TR( 2, 1 ) )
|
||
|
XNRM = ABS( X( 1, 1 ) ) + ABS( X( 1, 2 ) )
|
||
|
RES = ABS( ( ( TL( 1, 1 )+SGN*TR( 1,
|
||
|
$ 1 ) ) )*( X( 1, 1 ) )+
|
||
|
$ ( SGN*TR( 2, 1 ) )*( X( 1, 2 ) )-
|
||
|
$ ( SCALE*B( 1, 1 ) ) )
|
||
|
RES = RES + ABS( ( ( TL( 1, 1 )+SGN*TR( 2,
|
||
|
$ 2 ) ) )*( X( 1, 2 ) )+
|
||
|
$ ( SGN*TR( 1, 2 ) )*( X( 1, 1 ) )-
|
||
|
$ ( SCALE*B( 1, 2 ) ) )
|
||
|
DEN = MAX( SMLNUM, SMLNUM*XNRM,
|
||
|
$ ( TNRM*EPS )*XNRM )
|
||
|
RES = RES / DEN
|
||
|
IF( SCALE.GT.ONE )
|
||
|
$ RES = RES + ONE / EPS
|
||
|
RES = RES + ABS( XNORM-XNRM ) /
|
||
|
$ MAX( SMLNUM, XNORM ) / EPS
|
||
|
IF( RES.GT.RMAX ) THEN
|
||
|
LMAX = KNT
|
||
|
RMAX = RES
|
||
|
END IF
|
||
|
90 CONTINUE
|
||
|
100 CONTINUE
|
||
|
110 CONTINUE
|
||
|
120 CONTINUE
|
||
|
130 CONTINUE
|
||
|
*
|
||
|
N1 = 2
|
||
|
N2 = 2
|
||
|
DO 200 ITR = 1, 8
|
||
|
DO 190 ITRSCL = 1, 3
|
||
|
DO 180 ITL = 1, 8
|
||
|
DO 170 ITLSCL = 1, 3
|
||
|
DO 160 IB1 = 1, 3
|
||
|
DO 150 IB2 = 1, 3
|
||
|
DO 140 IB3 = 1, 3
|
||
|
B( 1, 1 ) = VAL( IB1 )
|
||
|
B( 2, 1 ) = -FOUR*VAL( IB2 )
|
||
|
B( 1, 2 ) = -TWO*VAL( IB3 )
|
||
|
B( 2, 2 ) = EIGHT*
|
||
|
$ MIN( VAL( IB1 ), VAL
|
||
|
$ ( IB2 ), VAL( IB3 ) )
|
||
|
TR( 1, 1 ) = ITVAL( 1, 1, ITR )*
|
||
|
$ VAL( ITRSCL )
|
||
|
TR( 2, 1 ) = ITVAL( 2, 1, ITR )*
|
||
|
$ VAL( ITRSCL )
|
||
|
TR( 1, 2 ) = ITVAL( 1, 2, ITR )*
|
||
|
$ VAL( ITRSCL )
|
||
|
TR( 2, 2 ) = ITVAL( 2, 2, ITR )*
|
||
|
$ VAL( ITRSCL )
|
||
|
TL( 1, 1 ) = ITVAL( 1, 1, ITL )*
|
||
|
$ VAL( ITLSCL )
|
||
|
TL( 2, 1 ) = ITVAL( 2, 1, ITL )*
|
||
|
$ VAL( ITLSCL )
|
||
|
TL( 1, 2 ) = ITVAL( 1, 2, ITL )*
|
||
|
$ VAL( ITLSCL )
|
||
|
TL( 2, 2 ) = ITVAL( 2, 2, ITL )*
|
||
|
$ VAL( ITLSCL )
|
||
|
KNT = KNT + 1
|
||
|
CALL DLASY2( LTRANL, LTRANR, ISGN,
|
||
|
$ N1, N2, TL, 2, TR, 2,
|
||
|
$ B, 2, SCALE, X, 2,
|
||
|
$ XNORM, INFO )
|
||
|
IF( INFO.NE.0 )
|
||
|
$ NINFO = NINFO + 1
|
||
|
IF( LTRANR ) THEN
|
||
|
TMP = TR( 1, 2 )
|
||
|
TR( 1, 2 ) = TR( 2, 1 )
|
||
|
TR( 2, 1 ) = TMP
|
||
|
END IF
|
||
|
IF( LTRANL ) THEN
|
||
|
TMP = TL( 1, 2 )
|
||
|
TL( 1, 2 ) = TL( 2, 1 )
|
||
|
TL( 2, 1 ) = TMP
|
||
|
END IF
|
||
|
TNRM = ABS( TR( 1, 1 ) ) +
|
||
|
$ ABS( TR( 2, 1 ) ) +
|
||
|
$ ABS( TR( 1, 2 ) ) +
|
||
|
$ ABS( TR( 2, 2 ) ) +
|
||
|
$ ABS( TL( 1, 1 ) ) +
|
||
|
$ ABS( TL( 2, 1 ) ) +
|
||
|
$ ABS( TL( 1, 2 ) ) +
|
||
|
$ ABS( TL( 2, 2 ) )
|
||
|
XNRM = MAX( ABS( X( 1, 1 ) )+
|
||
|
$ ABS( X( 1, 2 ) ),
|
||
|
$ ABS( X( 2, 1 ) )+
|
||
|
$ ABS( X( 2, 2 ) ) )
|
||
|
RES = ABS( ( ( TL( 1, 1 )+SGN*TR( 1,
|
||
|
$ 1 ) ) )*( X( 1, 1 ) )+
|
||
|
$ ( SGN*TR( 2, 1 ) )*
|
||
|
$ ( X( 1, 2 ) )+( TL( 1, 2 ) )*
|
||
|
$ ( X( 2, 1 ) )-
|
||
|
$ ( SCALE*B( 1, 1 ) ) )
|
||
|
RES = RES + ABS( ( TL( 1, 1 ) )*
|
||
|
$ ( X( 1, 2 ) )+
|
||
|
$ ( SGN*TR( 1, 2 ) )*
|
||
|
$ ( X( 1, 1 ) )+
|
||
|
$ ( SGN*TR( 2, 2 ) )*
|
||
|
$ ( X( 1, 2 ) )+( TL( 1, 2 ) )*
|
||
|
$ ( X( 2, 2 ) )-
|
||
|
$ ( SCALE*B( 1, 2 ) ) )
|
||
|
RES = RES + ABS( ( TL( 2, 1 ) )*
|
||
|
$ ( X( 1, 1 ) )+
|
||
|
$ ( SGN*TR( 1, 1 ) )*
|
||
|
$ ( X( 2, 1 ) )+
|
||
|
$ ( SGN*TR( 2, 1 ) )*
|
||
|
$ ( X( 2, 2 ) )+( TL( 2, 2 ) )*
|
||
|
$ ( X( 2, 1 ) )-
|
||
|
$ ( SCALE*B( 2, 1 ) ) )
|
||
|
RES = RES + ABS( ( ( TL( 2,
|
||
|
$ 2 )+SGN*TR( 2, 2 ) ) )*
|
||
|
$ ( X( 2, 2 ) )+
|
||
|
$ ( SGN*TR( 1, 2 ) )*
|
||
|
$ ( X( 2, 1 ) )+( TL( 2, 1 ) )*
|
||
|
$ ( X( 1, 2 ) )-
|
||
|
$ ( SCALE*B( 2, 2 ) ) )
|
||
|
DEN = MAX( SMLNUM, SMLNUM*XNRM,
|
||
|
$ ( TNRM*EPS )*XNRM )
|
||
|
RES = RES / DEN
|
||
|
IF( SCALE.GT.ONE )
|
||
|
$ RES = RES + ONE / EPS
|
||
|
RES = RES + ABS( XNORM-XNRM ) /
|
||
|
$ MAX( SMLNUM, XNORM ) / EPS
|
||
|
IF( RES.GT.RMAX ) THEN
|
||
|
LMAX = KNT
|
||
|
RMAX = RES
|
||
|
END IF
|
||
|
140 CONTINUE
|
||
|
150 CONTINUE
|
||
|
160 CONTINUE
|
||
|
170 CONTINUE
|
||
|
180 CONTINUE
|
||
|
190 CONTINUE
|
||
|
200 CONTINUE
|
||
|
210 CONTINUE
|
||
|
220 CONTINUE
|
||
|
230 CONTINUE
|
||
|
*
|
||
|
RETURN
|
||
|
*
|
||
|
* End of DGET32
|
||
|
*
|
||
|
END
|