88 SUBROUTINE zsyl01( THRESH, NFAIL, RMAX, NINFO, KNT )
97 DOUBLE PRECISION THRESH
100 INTEGER NFAIL( 3 ), NINFO( 2 )
101 DOUBLE PRECISION RMAX( 2 )
108 parameter( cone = ( 1.0d0, 0.0d+0 ) )
109 DOUBLE PRECISION ONE, ZERO
110 parameter( zero = 0.0d+0, one = 1.0d+0 )
111 INTEGER MAXM, MAXN, LDSWORK
112 parameter( maxm = 185, maxn = 192, ldswork = 36 )
115 CHARACTER TRANA, TRANB
116 INTEGER I, INFO, IINFO, ISGN, ITRANA, ITRANB, J, KLA,
117 $ KUA, KLB, KUB, M, N
118 DOUBLE PRECISION ANRM, BNRM, BIGNUM, EPS, RES, RES1,
119 $ SCALE, SCALE3, SMLNUM, TNRM, XNRM
123 COMPLEX*16 DUML( MAXM ), DUMR( MAXN ),
124 $ D( MAX( MAXM, MAXN ) )
125 DOUBLE PRECISION DUM( MAXN ), VM( 2 )
126 INTEGER ISEED( 4 ), IWORK( MAXM + MAXN + 2 )
129 INTEGER AllocateStatus
130 COMPLEX*16,
DIMENSION(:,:),
ALLOCATABLE :: A, B, C, CC, X
131 DOUBLE PRECISION,
DIMENSION(:,:),
ALLOCATABLE :: SWORK
135 DOUBLE PRECISION DLAMCH, ZLANGE
136 EXTERNAL disnan, dlamch, zlange
142 INTRINSIC abs, dble, max, sqrt
145 ALLOCATE ( a( maxm, maxm ), stat = allocatestatus )
146 IF( allocatestatus /= 0 ) stop
"*** Not enough memory ***"
147 ALLOCATE ( b( maxn, maxn ), stat = allocatestatus )
148 IF( allocatestatus /= 0 ) stop
"*** Not enough memory ***"
149 ALLOCATE ( c( maxm, maxn ), stat = allocatestatus )
150 IF( allocatestatus /= 0 ) stop
"*** Not enough memory ***"
151 ALLOCATE ( cc( maxm, maxn ), stat = allocatestatus )
152 IF( allocatestatus /= 0 ) stop
"*** Not enough memory ***"
153 ALLOCATE ( x( maxm, maxn ), stat = allocatestatus )
154 IF( allocatestatus /= 0 ) stop
"*** Not enough memory ***"
155 ALLOCATE ( swork( ldswork, 103 ), stat = allocatestatus )
156 IF( allocatestatus /= 0 ) stop
"*** Not enough memory ***"
163 smlnum = dlamch(
'S' ) / eps
164 bignum = one / smlnum
197 CALL zlatmr( m, m,
'S', iseed,
'N', d,
198 $ 6, one, cone,
'T',
'N',
199 $ duml, 1, one, dumr, 1, one,
200 $
'N', iwork, kla, kua, zero,
201 $ one,
'NO', a, maxm, iwork,
204 a( i, i ) = a( i, i ) * vm( j )
206 anrm = zlange(
'M', m, m, a, maxm, dum )
210 CALL zlatmr( n, n,
'S', iseed,
'N', d,
211 $ 6, one, cone,
'T',
'N',
212 $ duml, 1, one, dumr, 1, one,
213 $
'N', iwork, klb, kub, zero,
214 $ one,
'NO', b, maxn, iwork,
217 b( i, i ) = b( i, i ) * vm( j )
219 bnrm = zlange(
'M', n, n, b, maxn, dum )
220 tnrm = max( anrm, bnrm )
221 CALL zlatmr( m, n,
'S', iseed,
'N', d,
222 $ 6, one, cone,
'T',
'N',
223 $ duml, 1, one, dumr, 1, one,
224 $
'N', iwork, m, n, zero, one,
225 $
'NO', c, maxm, iwork, iinfo )
238 CALL zlacpy(
'All', m, n, c, maxm, x, maxm)
239 CALL zlacpy(
'All', m, n, c, maxm, cc, maxm)
240 CALL ztrsyl( trana, tranb, isgn, m, n,
241 $ a, maxm, b, maxn, x, maxm,
244 $ ninfo( 1 ) = ninfo( 1 ) + 1
245 xnrm = zlange(
'M', m, n, x, maxm, dum )
247 IF( xnrm.GT.one .AND. tnrm.GT.one )
THEN
248 IF( xnrm.GT.bignum / tnrm )
THEN
249 rmul = cone / max( xnrm, tnrm )
252 CALL zgemm( trana,
'N', m, n, m, rmul,
253 $ a, maxm, x, maxm, -scale*rmul,
255 CALL zgemm(
'N', tranb, m, n, n,
256 $ dble( isgn )*rmul, x, maxm, b,
257 $ maxn, cone, cc, maxm )
258 res1 = zlange(
'M', m, n, cc, maxm, dum )
259 res = res1 / max( smlnum, smlnum*xnrm,
260 $ ( ( abs( rmul )*tnrm )*eps )*xnrm )
262 $ nfail( 1 ) = nfail( 1 ) + 1
263 IF( res.GT.rmax( 1 ) )
266 CALL zlacpy(
'All', m, n, c, maxm, x, maxm )
267 CALL zlacpy(
'All', m, n, c, maxm, cc, maxm )
268 CALL ztrsyl3( trana, tranb, isgn, m, n,
269 $ a, maxm, b, maxn, x, maxm,
270 $ scale3, swork, ldswork, info)
272 $ ninfo( 2 ) = ninfo( 2 ) + 1
273 xnrm = zlange(
'M', m, n, x, maxm, dum )
275 IF( xnrm.GT.one .AND. tnrm.GT.one )
THEN
276 IF( xnrm.GT.bignum / tnrm )
THEN
277 rmul = cone / max( xnrm, tnrm )
280 CALL zgemm( trana,
'N', m, n, m, rmul,
281 $ a, maxm, x, maxm, -scale3*rmul,
283 CALL zgemm(
'N', tranb, m, n, n,
284 $ dble( isgn )*rmul, x, maxm, b,
285 $ maxn, cone, cc, maxm )
286 res1 = zlange(
'M', m, n, cc, maxm, dum )
287 res = res1 / max( smlnum, smlnum*xnrm,
288 $ ( ( abs( rmul )*tnrm )*eps )*xnrm )
291 IF( scale3.EQ.zero .AND. scale.GT.zero .OR.
292 $ iinfo.NE.info )
THEN
293 nfail( 3 ) = nfail( 3 ) + 1
295 IF( res.GT.thresh .OR. disnan( res ) )
296 $ nfail( 2 ) = nfail( 2 ) + 1
297 IF( res.GT.rmax( 2 ) )
306 DEALLOCATE (a, stat = allocatestatus)
307 DEALLOCATE (b, stat = allocatestatus)
308 DEALLOCATE (c, stat = allocatestatus)
309 DEALLOCATE (cc, stat = allocatestatus)
310 DEALLOCATE (x, stat = allocatestatus)
311 DEALLOCATE (swork, stat = allocatestatus)
subroutine zgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
ZGEMM
subroutine zlacpy(uplo, m, n, a, lda, b, ldb)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine ztrsyl3(trana, tranb, isgn, m, n, a, lda, b, ldb, c, ldc, scale, swork, ldswork, info)
ZTRSYL3
subroutine ztrsyl(trana, tranb, isgn, m, n, a, lda, b, ldb, c, ldc, scale, info)
ZTRSYL
subroutine zlatmr(m, n, dist, iseed, sym, d, mode, cond, dmax, rsign, grade, dl, model, condl, dr, moder, condr, pivtng, ipivot, kl, ku, sparse, anorm, pack, a, lda, iwork, info)
ZLATMR
subroutine zsyl01(thresh, nfail, rmax, ninfo, knt)
ZSYL01