1       SUBROUTINE ZCHKGK( 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 *  ZCHKGK tests ZGGBAK, a routine for backward balancing  of
 15 *  a matrix pair (A, B).
 16 *
 17 *  Arguments
 18 *  =========
 19 *
 20 *  NIN     (input) INTEGER
 21 *          The logical unit number for input.  NIN > 0.
 22 *
 23 *  NOUT    (input) INTEGER
 24 *          The logical unit number for output.  NOUT > 0.
 25 *
 26 *  =====================================================================
 27 *
 28 *     .. Parameters ..
 29       INTEGER            LDA, LDB, LDVL, LDVR
 30       PARAMETER          ( LDA = 50, LDB = 50, LDVL = 50, LDVR = 50 )
 31       INTEGER            LDE, LDF, LDWORK, LRWORK
 32       PARAMETER          ( LDE = 50, LDF = 50, LDWORK = 50,
 33      $                   LRWORK = 6*50 )
 34       DOUBLE PRECISION   ZERO
 35       PARAMETER          ( ZERO = 0.0D+0 )
 36       COMPLEX*16         CZERO, CONE
 37       PARAMETER          ( CZERO = ( 0.0D+00.0D+0 ),
 38      $                   CONE = ( 1.0D+00.0D+0 ) )
 39 *     ..
 40 *     .. Local Scalars ..
 41       INTEGER            I, IHI, ILO, INFO, J, KNT, M, N, NINFO
 42       DOUBLE PRECISION   ANORM, BNORM, EPS, RMAX, VMAX
 43       COMPLEX*16         CDUM
 44 *     ..
 45 *     .. Local Arrays ..
 46       INTEGER            LMAX( 4 )
 47       DOUBLE PRECISION   LSCALE( LDA ), RSCALE( LDA ), RWORK( LRWORK )
 48       COMPLEX*16         A( LDA, LDA ), AF( LDA, LDA ), B( LDB, LDB ),
 49      $                   BF( LDB, LDB ), E( LDE, LDE ), F( LDF, LDF ),
 50      $                   VL( LDVL, LDVL ), VLF( LDVL, LDVL ),
 51      $                   VR( LDVR, LDVR ), VRF( LDVR, LDVR ),
 52      $                   WORK( LDWORK, LDWORK )
 53 *     ..
 54 *     .. External Functions ..
 55       DOUBLE PRECISION   DLAMCH, ZLANGE
 56       EXTERNAL           DLAMCH, ZLANGE
 57 *     ..
 58 *     .. External Subroutines ..
 59       EXTERNAL           ZGEMM, ZGGBAK, ZGGBAL, ZLACPY
 60 *     ..
 61 *     .. Intrinsic Functions ..
 62       INTRINSIC          ABSDBLEDIMAGMAX
 63 *     ..
 64 *     .. Statement Functions ..
 65       DOUBLE PRECISION   CABS1
 66 *     ..
 67 *     .. Statement Function definitions ..
 68       CABS1( CDUM ) = ABSDBLE( CDUM ) ) + ABSDIMAG( CDUM ) )
 69 *     ..
 70 *     .. Executable Statements ..
 71 *
 72       LMAX( 1 ) = 0
 73       LMAX( 2 ) = 0
 74       LMAX( 3 ) = 0
 75       LMAX( 4 ) = 0
 76       NINFO = 0
 77       KNT = 0
 78       RMAX = ZERO
 79 *
 80       EPS = DLAMCH( 'Precision' )
 81 *
 82    10 CONTINUE
 83       READ( NIN, FMT = * )N, M
 84       IF( N.EQ.0 )
 85      $   GO TO 100
 86 *
 87       DO 20 I = 1, N
 88          READ( NIN, FMT = * )( A( I, J ), J = 1, N )
 89    20 CONTINUE
 90 *
 91       DO 30 I = 1, N
 92          READ( NIN, FMT = * )( B( I, J ), J = 1, N )
 93    30 CONTINUE
 94 *
 95       DO 40 I = 1, N
 96          READ( NIN, FMT = * )( VL( I, J ), J = 1, M )
 97    40 CONTINUE
 98 *
 99       DO 50 I = 1, N
100          READ( NIN, FMT = * )( VR( I, J ), J = 1, M )
101    50 CONTINUE
102 *
103       KNT = KNT + 1
104 *
105       ANORM = ZLANGE( 'M', N, N, A, LDA, RWORK )
106       BNORM = ZLANGE( 'M', N, N, B, LDB, RWORK )
107 *
108       CALL ZLACPY( 'FULL', N, N, A, LDA, AF, LDA )
109       CALL ZLACPY( 'FULL', N, N, B, LDB, BF, LDB )
110 *
111       CALL ZGGBAL( 'B', N, A, LDA, B, LDB, ILO, IHI, LSCALE, RSCALE,
112      $             RWORK, INFO )
113       IF( INFO.NE.0 ) THEN
114          NINFO = NINFO + 1
115          LMAX( 1 ) = KNT
116       END IF
117 *
118       CALL ZLACPY( 'FULL', N, M, VL, LDVL, VLF, LDVL )
119       CALL ZLACPY( 'FULL', N, M, VR, LDVR, VRF, LDVR )
120 *
121       CALL ZGGBAK( 'B''L', N, ILO, IHI, LSCALE, RSCALE, M, VL, LDVL,
122      $             INFO )
123       IF( INFO.NE.0 ) THEN
124          NINFO = NINFO + 1
125          LMAX( 2 ) = KNT
126       END IF
127 *
128       CALL ZGGBAK( 'B''R', N, ILO, IHI, LSCALE, RSCALE, M, VR, LDVR,
129      $             INFO )
130       IF( INFO.NE.0 ) THEN
131          NINFO = NINFO + 1
132          LMAX( 3 ) = KNT
133       END IF
134 *
135 *     Test of ZGGBAK
136 *
137 *     Check tilde(VL)'*A*tilde(VR) - VL'*tilde(A)*VR
138 *     where tilde(A) denotes the transformed matrix.
139 *
140       CALL ZGEMM( 'N''N', N, M, N, CONE, AF, LDA, VR, LDVR, CZERO,
141      $            WORK, LDWORK )
142       CALL ZGEMM( 'C''N', M, M, N, CONE, VL, LDVL, WORK, LDWORK,
143      $            CZERO, E, LDE )
144 *
145       CALL ZGEMM( 'N''N', N, M, N, CONE, A, LDA, VRF, LDVR, CZERO,
146      $            WORK, LDWORK )
147       CALL ZGEMM( 'C''N', M, M, N, CONE, VLF, LDVL, WORK, LDWORK,
148      $            CZERO, F, LDF )
149 *
150       VMAX = ZERO
151       DO 70 J = 1, M
152          DO 60 I = 1, M
153             VMAX = MAX( VMAX, CABS1( E( I, J )-F( I, J ) ) )
154    60    CONTINUE
155    70 CONTINUE
156       VMAX = VMAX / ( EPS*MAX( ANORM, BNORM ) )
157       IF( VMAX.GT.RMAX ) THEN
158          LMAX( 4 ) = KNT
159          RMAX = VMAX
160       END IF
161 *
162 *     Check tilde(VL)'*B*tilde(VR) - VL'*tilde(B)*VR
163 *
164       CALL ZGEMM( 'N''N', N, M, N, CONE, BF, LDB, VR, LDVR, CZERO,
165      $            WORK, LDWORK )
166       CALL ZGEMM( 'C''N', M, M, N, CONE, VL, LDVL, WORK, LDWORK,
167      $            CZERO, E, LDE )
168 *
169       CALL ZGEMM( 'n''n', N, M, N, CONE, B, LDB, VRF, LDVR, CZERO,
170      $            WORK, LDWORK )
171       CALL ZGEMM( 'C''N', M, M, N, CONE, VLF, LDVL, WORK, LDWORK,
172      $            CZERO, F, LDF )
173 *
174       VMAX = ZERO
175       DO 90 J = 1, M
176          DO 80 I = 1, M
177             VMAX = MAX( VMAX, CABS1( E( I, J )-F( I, J ) ) )
178    80    CONTINUE
179    90 CONTINUE
180       VMAX = VMAX / ( EPS*MAX( ANORM, BNORM ) )
181       IF( VMAX.GT.RMAX ) THEN
182          LMAX( 4 ) = KNT
183          RMAX = VMAX
184       END IF
185 *
186       GO TO 10
187 *
188   100 CONTINUE
189 *
190       WRITE( NOUT, FMT = 9999 )
191  9999 FORMAT1X'.. test output of ZGGBAK .. ' )
192 *
193       WRITE( NOUT, FMT = 9998 )RMAX
194  9998 FORMAT' value of largest test error                  ='D12.3 )
195       WRITE( NOUT, FMT = 9997 )LMAX( 1 )
196  9997 FORMAT' example number where ZGGBAL info is not 0    =', I4 )
197       WRITE( NOUT, FMT = 9996 )LMAX( 2 )
198  9996 FORMAT' example number where ZGGBAK(L) info is not 0 =', I4 )
199       WRITE( NOUT, FMT = 9995 )LMAX( 3 )
200  9995 FORMAT' example number where ZGGBAK(R) info is not 0 =', I4 )
201       WRITE( NOUT, FMT = 9994 )LMAX( 4 )
202  9994 FORMAT' example number having largest error          =', I4 )
203       WRITE( NOUT, FMT = 9992 )NINFO
204  9992 FORMAT' number of examples where info is not 0       =', I4 )
205       WRITE( NOUT, FMT = 9991 )KNT
206  9991 FORMAT' total number of examples tested              =', I4 )
207 *
208       RETURN
209 *
210 *     End of ZCHKGK
211 *
212       END