257 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Fortran
		
	
	
	
			
		
		
	
	
			257 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Fortran
		
	
	
	
| *> \brief \b SGET35
 | |
| *
 | |
| *  =========== DOCUMENTATION ===========
 | |
| *
 | |
| * Online html documentation available at 
 | |
| *            http://www.netlib.org/lapack/explore-html/ 
 | |
| *
 | |
| *  Definition:
 | |
| *  ===========
 | |
| *
 | |
| *       SUBROUTINE SGET35( RMAX, LMAX, NINFO, KNT )
 | |
| * 
 | |
| *       .. Scalar Arguments ..
 | |
| *       INTEGER            KNT, LMAX, NINFO
 | |
| *       REAL               RMAX
 | |
| *       ..
 | |
| *  
 | |
| *
 | |
| *> \par Purpose:
 | |
| *  =============
 | |
| *>
 | |
| *> \verbatim
 | |
| *>
 | |
| *> SGET35 tests STRSYL, a routine for solving the Sylvester matrix
 | |
| *> equation
 | |
| *>
 | |
| *>    op(A)*X + ISGN*X*op(B) = scale*C,
 | |
| *>
 | |
| *> A and B are assumed to be in Schur canonical form, op() represents an
 | |
| *> optional transpose, and ISGN can be -1 or +1.  Scale is an output
 | |
| *> less than or equal to 1, chosen to avoid overflow in X.
 | |
| *>
 | |
| *> The test code verifies that the following residual is order 1:
 | |
| *>
 | |
| *>    norm(op(A)*X + ISGN*X*op(B) - scale*C) /
 | |
| *>        (EPS*max(norm(A),norm(B))*norm(X))
 | |
| *> \endverbatim
 | |
| *
 | |
| *  Arguments:
 | |
| *  ==========
 | |
| *
 | |
| *> \param[out] RMAX
 | |
| *> \verbatim
 | |
| *>          RMAX is REAL
 | |
| *>          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 where INFO is nonzero.
 | |
| *> \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. 
 | |
| *
 | |
| *> \date November 2011
 | |
| *
 | |
| *> \ingroup single_eig
 | |
| *
 | |
| *  =====================================================================
 | |
|       SUBROUTINE SGET35( RMAX, LMAX, NINFO, KNT )
 | |
| *
 | |
| *  -- LAPACK test routine (version 3.4.0) --
 | |
| *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
 | |
| *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
 | |
| *     November 2011
 | |
| *
 | |
| *     .. Scalar Arguments ..
 | |
|       INTEGER            KNT, LMAX, NINFO
 | |
|       REAL               RMAX
 | |
| *     ..
 | |
| *
 | |
| *  =====================================================================
 | |
| *
 | |
| *     .. Parameters ..
 | |
|       REAL               ZERO, ONE
 | |
|       PARAMETER          ( ZERO = 0.0E0, ONE = 1.0E0 )
 | |
|       REAL               TWO, FOUR
 | |
|       PARAMETER          ( TWO = 2.0E0, FOUR = 4.0E0 )
 | |
| *     ..
 | |
| *     .. Local Scalars ..
 | |
|       CHARACTER          TRANA, TRANB
 | |
|       INTEGER            I, IMA, IMB, IMLDA1, IMLDA2, IMLDB1, IMLOFF,
 | |
|      $                   INFO, ISGN, ITRANA, ITRANB, J, M, N
 | |
|       REAL               BIGNUM, CNRM, EPS, RES, RES1, RMUL, SCALE,
 | |
|      $                   SMLNUM, TNRM, XNRM
 | |
| *     ..
 | |
| *     .. Local Arrays ..
 | |
|       INTEGER            IDIM( 8 ), IVAL( 6, 6, 8 )
 | |
|       REAL               A( 6, 6 ), B( 6, 6 ), C( 6, 6 ), CC( 6, 6 ),
 | |
|      $                   DUM( 1 ), VM1( 3 ), VM2( 3 )
 | |
| *     ..
 | |
| *     .. External Functions ..
 | |
|       REAL               SLAMCH, SLANGE
 | |
|       EXTERNAL           SLAMCH, SLANGE
 | |
| *     ..
 | |
| *     .. External Subroutines ..
 | |
|       EXTERNAL           SGEMM, STRSYL
 | |
| *     ..
 | |
| *     .. Intrinsic Functions ..
 | |
|       INTRINSIC          ABS, MAX, REAL, SIN, SQRT
 | |
| *     ..
 | |
| *     .. Data statements ..
 | |
|       DATA               IDIM / 1, 2, 3, 4, 3, 3, 6, 4 /
 | |
|       DATA               IVAL / 1, 35*0, 1, 2, 4*0, -2, 0, 28*0, 1, 5*0,
 | |
|      $                   5, 1, 2, 3*0, -8, -2, 1, 21*0, 3, 4, 4*0, -5,
 | |
|      $                   3, 4*0, 1, 2, 1, 4, 2*0, -3, -9, -1, 1, 14*0,
 | |
|      $                   1, 5*0, 2, 3, 4*0, 5, 6, 7, 21*0, 1, 5*0, 1, 3,
 | |
|      $                   -4, 3*0, 2, 5, 2, 21*0, 1, 2, 4*0, -2, 0, 4*0,
 | |
|      $                   5, 6, 3, 4, 2*0, -1, -9, -5, 2, 2*0, 4*8, 5, 6,
 | |
|      $                   4*9, -7, 5, 1, 5*0, 1, 5, 2, 3*0, 2, -21, 5,
 | |
|      $                   3*0, 1, 2, 3, 4, 14*0 /
 | |
| *     ..
 | |
| *     .. Executable Statements ..
 | |
| *
 | |
| *     Get machine parameters
 | |
| *
 | |
|       EPS = SLAMCH( 'P' )
 | |
|       SMLNUM = SLAMCH( 'S' )*FOUR / EPS
 | |
|       BIGNUM = ONE / SMLNUM
 | |
|       CALL SLABAD( SMLNUM, BIGNUM )
 | |
| *
 | |
| *     Set up test case parameters
 | |
| *
 | |
|       VM1( 1 ) = SQRT( SMLNUM )
 | |
|       VM1( 2 ) = ONE
 | |
|       VM1( 3 ) = SQRT( BIGNUM )
 | |
|       VM2( 1 ) = ONE
 | |
|       VM2( 2 ) = ONE + TWO*EPS
 | |
|       VM2( 3 ) = TWO
 | |
| *
 | |
|       KNT = 0
 | |
|       NINFO = 0
 | |
|       LMAX = 0
 | |
|       RMAX = ZERO
 | |
| *
 | |
| *     Begin test loop
 | |
| *
 | |
|       DO 150 ITRANA = 1, 2
 | |
|          DO 140 ITRANB = 1, 2
 | |
|             DO 130 ISGN = -1, 1, 2
 | |
|                DO 120 IMA = 1, 8
 | |
|                   DO 110 IMLDA1 = 1, 3
 | |
|                      DO 100 IMLDA2 = 1, 3
 | |
|                         DO 90 IMLOFF = 1, 2
 | |
|                            DO 80 IMB = 1, 8
 | |
|                               DO 70 IMLDB1 = 1, 3
 | |
|                                  IF( ITRANA.EQ.1 )
 | |
|      $                              TRANA = 'N'
 | |
|                                  IF( ITRANA.EQ.2 )
 | |
|      $                              TRANA = 'T'
 | |
|                                  IF( ITRANB.EQ.1 )
 | |
|      $                              TRANB = 'N'
 | |
|                                  IF( ITRANB.EQ.2 )
 | |
|      $                              TRANB = 'T'
 | |
|                                  M = IDIM( IMA )
 | |
|                                  N = IDIM( IMB )
 | |
|                                  TNRM = ZERO
 | |
|                                  DO 20 I = 1, M
 | |
|                                     DO 10 J = 1, M
 | |
|                                        A( I, J ) = IVAL( I, J, IMA )
 | |
|                                        IF( ABS( I-J ).LE.1 ) THEN
 | |
|                                           A( I, J ) = A( I, J )*
 | |
|      $                                                VM1( IMLDA1 )
 | |
|                                           A( I, J ) = A( I, J )*
 | |
|      $                                                VM2( IMLDA2 )
 | |
|                                        ELSE
 | |
|                                           A( I, J ) = A( I, J )*
 | |
|      $                                                VM1( IMLOFF )
 | |
|                                        END IF
 | |
|                                        TNRM = MAX( TNRM,
 | |
|      $                                        ABS( A( I, J ) ) )
 | |
|    10                               CONTINUE
 | |
|    20                            CONTINUE
 | |
|                                  DO 40 I = 1, N
 | |
|                                     DO 30 J = 1, N
 | |
|                                        B( I, J ) = IVAL( I, J, IMB )
 | |
|                                        IF( ABS( I-J ).LE.1 ) THEN
 | |
|                                           B( I, J ) = B( I, J )*
 | |
|      $                                                VM1( IMLDB1 )
 | |
|                                        ELSE
 | |
|                                           B( I, J ) = B( I, J )*
 | |
|      $                                                VM1( IMLOFF )
 | |
|                                        END IF
 | |
|                                        TNRM = MAX( TNRM,
 | |
|      $                                        ABS( B( I, J ) ) )
 | |
|    30                               CONTINUE
 | |
|    40                            CONTINUE
 | |
|                                  CNRM = ZERO
 | |
|                                  DO 60 I = 1, M
 | |
|                                     DO 50 J = 1, N
 | |
|                                        C( I, J ) = SIN( REAL( I*J ) )
 | |
|                                        CNRM = MAX( CNRM, C( I, J ) )
 | |
|                                        CC( I, J ) = C( I, J )
 | |
|    50                               CONTINUE
 | |
|    60                            CONTINUE
 | |
|                                  KNT = KNT + 1
 | |
|                                  CALL STRSYL( TRANA, TRANB, ISGN, M, N,
 | |
|      $                                        A, 6, B, 6, C, 6, SCALE,
 | |
|      $                                        INFO )
 | |
|                                  IF( INFO.NE.0 )
 | |
|      $                              NINFO = NINFO + 1
 | |
|                                  XNRM = SLANGE( 'M', M, N, C, 6, DUM )
 | |
|                                  RMUL = ONE
 | |
|                                  IF( XNRM.GT.ONE .AND. TNRM.GT.ONE )
 | |
|      $                                THEN
 | |
|                                     IF( XNRM.GT.BIGNUM / TNRM ) THEN
 | |
|                                        RMUL = ONE / MAX( XNRM, TNRM )
 | |
|                                     END IF
 | |
|                                  END IF
 | |
|                                  CALL SGEMM( TRANA, 'N', M, N, M, RMUL,
 | |
|      $                                       A, 6, C, 6, -SCALE*RMUL,
 | |
|      $                                       CC, 6 )
 | |
|                                  CALL SGEMM( 'N', TRANB, M, N, N,
 | |
|      $                                       REAL( ISGN )*RMUL, C, 6, B,
 | |
|      $                                       6, ONE, CC, 6 )
 | |
|                                  RES1 = SLANGE( 'M', M, N, CC, 6, DUM )
 | |
|                                  RES = RES1 / MAX( SMLNUM, SMLNUM*XNRM,
 | |
|      $                                 ( ( RMUL*TNRM )*EPS )*XNRM )
 | |
|                                  IF( RES.GT.RMAX ) THEN
 | |
|                                     LMAX = KNT
 | |
|                                     RMAX = RES
 | |
|                                  END IF
 | |
|    70                         CONTINUE
 | |
|    80                      CONTINUE
 | |
|    90                   CONTINUE
 | |
|   100                CONTINUE
 | |
|   110             CONTINUE
 | |
|   120          CONTINUE
 | |
|   130       CONTINUE
 | |
|   140    CONTINUE
 | |
|   150 CONTINUE
 | |
| *
 | |
|       RETURN
 | |
| *
 | |
| *     End of SGET35
 | |
| *
 | |
|       END
 |