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 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