1       SUBROUTINE DCHKGL( NIN, NOUT )
  2 *
  3 *  -- LAPACK test routine (version 3.1) --
  4 *     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
  5 *     November 2006
  6 *
  7 *     .. Scalar Arguments ..
  8       INTEGER            NIN, NOUT
  9 *     ..
 10 *
 11 *  Purpose
 12 *  =======
 13 *
 14 *  DCHKGL tests DGGBAL, a routine for balancing a matrix pair (A, B).
 15 *
 16 *  Arguments
 17 *  =========
 18 *
 19 *  NIN     (input) INTEGER
 20 *          The logical unit number for input.  NIN > 0.
 21 *
 22 *  NOUT    (input) INTEGER
 23 *          The logical unit number for output.  NOUT > 0.
 24 *
 25 *  =====================================================================
 26 *
 27 *     .. Parameters ..
 28       INTEGER            LDA, LDB, LWORK
 29       PARAMETER          ( LDA = 20, LDB = 20, LWORK = 6*LDA )
 30       DOUBLE PRECISION   ZERO
 31       PARAMETER          ( ZERO = 0.0D+0 )
 32 *     ..
 33 *     .. Local Scalars ..
 34       INTEGER            I, IHI, IHIIN, ILO, ILOIN, INFO, J, KNT, N,
 35      $                   NINFO
 36       DOUBLE PRECISION   ANORM, BNORM, EPS, RMAX, VMAX
 37 *     ..
 38 *     .. Local Arrays ..
 39       INTEGER            LMAX( 5 )
 40       DOUBLE PRECISION   A( LDA, LDA ), AIN( LDA, LDA ), B( LDB, LDB ),
 41      $                   BIN( LDB, LDB ), LSCALE( LDA ), LSCLIN( LDA ),
 42      $                   RSCALE( LDA ), RSCLIN( LDA ), WORK( LWORK )
 43 *     ..
 44 *     .. External Functions ..
 45       DOUBLE PRECISION   DLAMCH, DLANGE
 46       EXTERNAL           DLAMCH, DLANGE
 47 *     ..
 48 *     .. External Subroutines ..
 49       EXTERNAL           DGGBAL
 50 *     ..
 51 *     .. Intrinsic Functions ..
 52       INTRINSIC          ABSMAX
 53 *     ..
 54 *     .. Executable Statements ..
 55 *
 56       LMAX( 1 ) = 0
 57       LMAX( 2 ) = 0
 58       LMAX( 3 ) = 0
 59       NINFO = 0
 60       KNT = 0
 61       RMAX = ZERO
 62 *
 63       EPS = DLAMCH( 'Precision' )
 64 *
 65    10 CONTINUE
 66 *
 67       READ( NIN, FMT = * )N
 68       IF( N.EQ.0 )
 69      $   GO TO 90
 70       DO 20 I = 1, N
 71          READ( NIN, FMT = * )( A( I, J ), J = 1, N )
 72    20 CONTINUE
 73 *
 74       DO 30 I = 1, N
 75          READ( NIN, FMT = * )( B( I, J ), J = 1, N )
 76    30 CONTINUE
 77 *
 78       READ( NIN, FMT = * )ILOIN, IHIIN
 79       DO 40 I = 1, N
 80          READ( NIN, FMT = * )( AIN( I, J ), J = 1, N )
 81    40 CONTINUE
 82       DO 50 I = 1, N
 83          READ( NIN, FMT = * )( BIN( I, J ), J = 1, N )
 84    50 CONTINUE
 85 *
 86       READ( NIN, FMT = * )( LSCLIN( I ), I = 1, N )
 87       READ( NIN, FMT = * )( RSCLIN( I ), I = 1, N )
 88 *
 89       ANORM = DLANGE( 'M', N, N, A, LDA, WORK )
 90       BNORM = DLANGE( 'M', N, N, B, LDB, WORK )
 91 *
 92       KNT = KNT + 1
 93 *
 94       CALL DGGBAL( 'B', N, A, LDA, B, LDB, ILO, IHI, LSCALE, RSCALE,
 95      $             WORK, INFO )
 96 *
 97       IF( INFO.NE.0 ) THEN
 98          NINFO = NINFO + 1
 99          LMAX( 1 ) = KNT
100       END IF
101 *
102       IF( ILO.NE.ILOIN .OR. IHI.NE.IHIIN ) THEN
103          NINFO = NINFO + 1
104          LMAX( 2 ) = KNT
105       END IF
106 *
107       VMAX = ZERO
108       DO 70 I = 1, N
109          DO 60 J = 1, N
110             VMAX = MAX( VMAX, ABS( A( I, J )-AIN( I, J ) ) )
111             VMAX = MAX( VMAX, ABS( B( I, J )-BIN( I, J ) ) )
112    60    CONTINUE
113    70 CONTINUE
114 *
115       DO 80 I = 1, N
116          VMAX = MAX( VMAX, ABS( LSCALE( I )-LSCLIN( I ) ) )
117          VMAX = MAX( VMAX, ABS( RSCALE( I )-RSCLIN( I ) ) )
118    80 CONTINUE
119 *
120       VMAX = VMAX / ( EPS*MAX( ANORM, BNORM ) )
121 *
122       IF( VMAX.GT.RMAX ) THEN
123          LMAX( 3 ) = KNT
124          RMAX = VMAX
125       END IF
126 *
127       GO TO 10
128 *
129    90 CONTINUE
130 *
131       WRITE( NOUT, FMT = 9999 )
132  9999 FORMAT1X'.. test output of DGGBAL .. ' )
133 *
134       WRITE( NOUT, FMT = 9998 )RMAX
135  9998 FORMAT1X'value of largest test error            = 'D12.3 )
136       WRITE( NOUT, FMT = 9997 )LMAX( 1 )
137  9997 FORMAT1X'example number where info is not zero  = ', I4 )
138       WRITE( NOUT, FMT = 9996 )LMAX( 2 )
139  9996 FORMAT1X'example number where ILO or IHI wrong  = ', I4 )
140       WRITE( NOUT, FMT = 9995 )LMAX( 3 )
141  9995 FORMAT1X'example number having largest error    = ', I4 )
142       WRITE( NOUT, FMT = 9994 )NINFO
143  9994 FORMAT1X'number of examples where info is not 0 = ', I4 )
144       WRITE( NOUT, FMT = 9993 )KNT
145  9993 FORMAT1X'total number of examples tested        = ', I4 )
146 *
147       RETURN
148 *
149 *     End of DCHKGL
150 *
151       END