88 SUBROUTINE ssyl01( THRESH, NFAIL, RMAX, NINFO, KNT )
100 INTEGER NFAIL( 3 ), NINFO( 2 )
108 parameter( zero = 0.0e+0, one = 1.0e+0 )
109 INTEGER MAXM, MAXN, LDSWORK
110 parameter( maxm = 101, maxn = 138, ldswork = 18 )
113 CHARACTER TRANA, TRANB
114 INTEGER I, INFO, IINFO, ISGN, ITRANA, ITRANB, J, KLA,
115 $ KUA, KLB, KUB, LIWORK, M, N
116 REAL ANRM, BNRM, BIGNUM, EPS, RES, RES1, RMUL,
117 $ SCALE, SCALE3, SMLNUM, TNRM, XNRM
120 REAL A( MAXM, MAXM ), B( MAXN, MAXN ),
121 $ C( MAXM, MAXN ), CC( MAXM, MAXN ),
123 $ DUML( MAXM ), DUMR( MAXN ),
124 $ D( MAX( MAXM, MAXN ) ), DUM( MAXN ),
125 $ SWORK( LDSWORK, 54 ), VM( 2 )
126 INTEGER ISEED( 4 ), IWORK( MAXM + MAXN + 2 ), IDUM( 2 )
131 EXTERNAL sisnan, slamch, slange
137 INTRINSIC abs, real, max
144 smlnum = slamch(
'S' ) / eps
145 bignum = one / smlnum
165 liwork = maxm + maxn + 2
175 CALL slatmr( m, m,
'S', iseed,
'N', d,
176 $ 6, one, one,
'T',
'N',
177 $ duml, 1, one, dumr, 1, one,
178 $
'N', iwork, kla, kua, zero,
179 $ one,
'NO', a, maxm, iwork, iinfo )
181 a( i, i ) = a( i, i ) * vm( j )
183 anrm = slange(
'M', m, m, a, maxm, dum )
187 CALL slatmr( n, n,
'S', iseed,
'N', d,
188 $ 6, one, one,
'T',
'N',
189 $ duml, 1, one, dumr, 1, one,
190 $
'N', iwork, klb, kub, zero,
191 $ one,
'NO', b, maxn, iwork, iinfo )
192 bnrm = slange(
'M', n, n, b, maxn, dum )
193 tnrm = max( anrm, bnrm )
194 CALL slatmr( m, n,
'S', iseed,
'N', d,
195 $ 6, one, one,
'T',
'N',
196 $ duml, 1, one, dumr, 1, one,
197 $
'N', iwork, m, n, zero, one,
198 $
'NO', c, maxm, iwork, iinfo )
200 IF( itrana.EQ.1 )
THEN
203 IF( itrana.EQ.2 )
THEN
207 IF( itranb.EQ.1 )
THEN
210 IF( itranb.EQ.2 )
THEN
215 CALL slacpy(
'All', m, n, c, maxm, x, maxm)
216 CALL slacpy(
'All', m, n, c, maxm, cc, maxm)
217 CALL strsyl( trana, tranb, isgn, m, n,
218 $ a, maxm, b, maxn, x, maxm,
221 $ ninfo( 1 ) = ninfo( 1 ) + 1
222 xnrm = slange(
'M', m, n, x, maxm, dum )
224 IF( xnrm.GT.one .AND. tnrm.GT.one )
THEN
225 IF( xnrm.GT.bignum / tnrm )
THEN
226 rmul = one / max( xnrm, tnrm )
229 CALL sgemm( trana,
'N', m, n, m, rmul,
230 $ a, maxm, x, maxm, -scale*rmul,
232 CALL sgemm(
'N', tranb, m, n, n,
233 $ real( isgn )*rmul, x, maxm, b,
234 $ maxn, one, c, maxm )
235 res1 = slange(
'M', m, n, c, maxm, dum )
236 res = res1 / max( smlnum, smlnum*xnrm,
237 $ ( ( rmul*tnrm )*eps )*xnrm )
239 $ nfail( 1 ) = nfail( 1 ) + 1
240 IF( res.GT.rmax( 1 ) )
243 CALL slacpy(
'All', m, n, c, maxm, x, maxm )
244 CALL slacpy(
'All', m, n, c, maxm, cc, maxm )
245 CALL strsyl3( trana, tranb, isgn, m, n,
246 $ a, maxm, b, maxn, x, maxm,
247 $ scale3, iwork, liwork,
248 $ swork, ldswork, info)
250 $ ninfo( 2 ) = ninfo( 2 ) + 1
251 xnrm = slange(
'M', m, n, x, maxm, dum )
253 IF( xnrm.GT.one .AND. tnrm.GT.one )
THEN
254 IF( xnrm.GT.bignum / tnrm )
THEN
255 rmul = one / max( xnrm, tnrm )
258 CALL sgemm( trana,
'N', m, n, m, rmul,
259 $ a, maxm, x, maxm, -scale3*rmul,
261 CALL sgemm(
'N', tranb, m, n, n,
262 $ real( isgn )*rmul, x, maxm, b,
263 $ maxn, one, cc, maxm )
264 res1 = slange(
'M', m, n, cc, maxm, dum )
265 res = res1 / max( smlnum, smlnum*xnrm,
266 $ ( ( rmul*tnrm )*eps )*xnrm )
269 IF( scale3.EQ.zero .AND. scale.GT.zero .OR.
270 $ iinfo.NE.info )
THEN
271 nfail( 3 ) = nfail( 3 ) + 1
273 IF( res.GT.thresh .OR. sisnan( res ) )
274 $ nfail( 2 ) = nfail( 2 ) + 1
275 IF( res.GT.rmax( 2 ) )
subroutine slacpy(UPLO, M, N, A, LDA, B, LDB)
SLACPY copies all or part of one two-dimensional array to another.
subroutine slatmr(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)
SLATMR
subroutine strsyl(TRANA, TRANB, ISGN, M, N, A, LDA, B, LDB, C, LDC, SCALE, INFO)
STRSYL
subroutine sgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
SGEMM
subroutine ssyl01(THRESH, NFAIL, RMAX, NINFO, KNT)
SSYL01
subroutine strsyl3(TRANA, TRANB, ISGN, M, N, A, LDA, B, LDB, C, LDC, SCALE, IWORK, LIWORK, SWORK, LDSWORK, INFO)
STRSYL3