89 IMPLICIT NONE
90
91
92
93
94
95
96 INTEGER KNT
97 REAL THRESH
98
99
100 INTEGER NFAIL( 3 ), NINFO( 2 )
101 REAL RMAX( 2 )
102
103
104
105
106
107 COMPLEX CONE
108 parameter( cone = ( 1.0e+0, 0.0e+0 ) )
109 REAL ONE, ZERO
110 parameter( zero = 0.0e+0, one = 1.0e+0 )
111 INTEGER MAXM, MAXN, LDSWORK
112 parameter( maxm = 101, maxn = 138, ldswork = 18 )
113
114
115 CHARACTER TRANA, TRANB
116 INTEGER I, INFO, IINFO, ISGN, ITRANA, ITRANB, J, KLA,
117 $ KUA, KLB, KUB, M, N
118 REAL ANRM, BNRM, BIGNUM, EPS, RES, RES1,
119 $ SCALE, SCALE3, SMLNUM, TNRM, XNRM
120 COMPLEX RMUL
121
122
123 COMPLEX A( MAXM, MAXM ), B( MAXN, MAXN ),
124 $ C( MAXM, MAXN ), CC( MAXM, MAXN ),
125 $ X( MAXM, MAXN ),
126 $ DUML( MAXM ), DUMR( MAXN ),
127 $ D( MIN( MAXM, MAXN ) )
128 REAL SWORK( LDSWORK, 54 ), DUM( MAXN ), VM( 2 )
129 INTEGER ISEED( 4 ), IWORK( MAXM + MAXN + 2 )
130
131
132 LOGICAL SISNAN
133 REAL SLAMCH, CLANGE
135
136
138
139
140 INTRINSIC abs, real, max
141
142
143
144
145
147 smlnum =
slamch(
'S' ) / eps
148 bignum = one / smlnum
149
150
151 vm( 1 ) = one
152
153 vm( 2 ) = 0.5e+0
154
155
156
157 ninfo( 1 ) = 0
158 ninfo( 2 ) = 0
159 nfail( 1 ) = 0
160 nfail( 2 ) = 0
161 nfail( 3 ) = 0
162 rmax( 1 ) = zero
163 rmax( 2 ) = zero
164 knt = 0
165 iseed( 1 ) = 1
166 iseed( 2 ) = 1
167 iseed( 3 ) = 1
168 iseed( 4 ) = 1
169 scale = one
170 scale3 = one
171 DO j = 1, 2
172 DO isgn = -1, 1, 2
173
174 iseed( 1 ) = 1
175 iseed( 2 ) = 1
176 iseed( 3 ) = 1
177 iseed( 4 ) = 1
178 DO m = 32, maxm, 23
179 kla = 0
180 kua = m - 1
181 CALL clatmr( m, m,
'S', iseed,
'N', d,
182 $ 6, one, cone, 'T', 'N',
183 $ duml, 1, one, dumr, 1, one,
184 $ 'N', iwork, kla, kua, zero,
185 $ one, 'NO', a, maxm, iwork,
186 $ iinfo )
187 DO i = 1, m
188 a( i, i ) = a( i, i ) * vm( j )
189 END DO
190 anrm =
clange(
'M', m, m, a, maxm, dum )
191 DO n = 51, maxn, 29
192 klb = 0
193 kub = n - 1
194 CALL clatmr( n, n,
'S', iseed,
'N', d,
195 $ 6, one, cone, 'T', 'N',
196 $ duml, 1, one, dumr, 1, one,
197 $ 'N', iwork, klb, kub, zero,
198 $ one, 'NO', b, maxn, iwork,
199 $ iinfo )
200 DO i = 1, n
201 b( i, i ) = b( i, i ) * vm( j )
202 END DO
203 bnrm =
clange(
'M', n, n, b, maxn, dum )
204 tnrm = max( anrm, bnrm )
205 CALL clatmr( m, n,
'S', iseed,
'N', d,
206 $ 6, one, cone, 'T', 'N',
207 $ duml, 1, one, dumr, 1, one,
208 $ 'N', iwork, m, n, zero, one,
209 $ 'NO', c, maxm, iwork, iinfo )
210 DO itrana = 1, 2
211 IF( itrana.EQ.1 )
212 $ trana = 'N'
213 IF( itrana.EQ.2 )
214 $ trana = 'C'
215 DO itranb = 1, 2
216 IF( itranb.EQ.1 )
217 $ tranb = 'N'
218 IF( itranb.EQ.2 )
219 $ tranb = 'C'
220 knt = knt + 1
221
222 CALL clacpy(
'All', m, n, c, maxm, x, maxm)
223 CALL clacpy(
'All', m, n, c, maxm, cc, maxm)
224 CALL ctrsyl( trana, tranb, isgn, m, n,
225 $ a, maxm, b, maxn, x, maxm,
226 $ scale, iinfo )
227 IF( iinfo.NE.0 )
228 $ ninfo( 1 ) = ninfo( 1 ) + 1
229 xnrm =
clange(
'M', m, n, x, maxm, dum )
230 rmul = cone
231 IF( xnrm.GT.one .AND. tnrm.GT.one ) THEN
232 IF( xnrm.GT.bignum / tnrm ) THEN
233 rmul = cone / max( xnrm, tnrm )
234 END IF
235 END IF
236 CALL cgemm( trana,
'N', m, n, m, rmul,
237 $ a, maxm, x, maxm, -scale*rmul,
238 $ cc, maxm )
239 CALL cgemm(
'N', tranb, m, n, n,
240 $ real( isgn )*rmul, x, maxm, b,
241 $ maxn, cone, cc, maxm )
242 res1 =
clange(
'M', m, n, cc, maxm, dum )
243 res = res1 / max( smlnum, smlnum*xnrm,
244 $ ( ( abs( rmul )*tnrm )*eps )*xnrm )
245 IF( res.GT.thresh )
246 $ nfail( 1 ) = nfail( 1 ) + 1
247 IF( res.GT.rmax( 1 ) )
248 $ rmax( 1 ) = res
249
250 CALL clacpy(
'All', m, n, c, maxm, x, maxm )
251 CALL clacpy(
'All', m, n, c, maxm, cc, maxm )
252 CALL ctrsyl3( trana, tranb, isgn, m, n,
253 $ a, maxm, b, maxn, x, maxm,
254 $ scale3, swork, ldswork, info)
255 IF( info.NE.0 )
256 $ ninfo( 2 ) = ninfo( 2 ) + 1
257 xnrm =
clange(
'M', m, n, x, maxm, dum )
258 rmul = cone
259 IF( xnrm.GT.one .AND. tnrm.GT.one ) THEN
260 IF( xnrm.GT.bignum / tnrm ) THEN
261 rmul = cone / max( xnrm, tnrm )
262 END IF
263 END IF
264 CALL cgemm( trana,
'N', m, n, m, rmul,
265 $ a, maxm, x, maxm, -scale3*rmul,
266 $ cc, maxm )
267 CALL cgemm(
'N', tranb, m, n, n,
268 $ real( isgn )*rmul, x, maxm, b,
269 $ maxn, cone, cc, maxm )
270 res1 =
clange(
'M', m, n, cc, maxm, dum )
271 res = res1 / max( smlnum, smlnum*xnrm,
272 $ ( ( abs( rmul )*tnrm )*eps )*xnrm )
273
274
275 IF( scale3.EQ.zero .AND. scale.GT.zero .OR.
276 $ iinfo.NE.info ) THEN
277 nfail( 3 ) = nfail( 3 ) + 1
278 END IF
279 IF( res.GT.thresh .OR.
sisnan( res ) )
280 $ nfail( 2 ) = nfail( 2 ) + 1
281 IF( res.GT.rmax( 2 ) )
282 $ rmax( 2 ) = res
283 END DO
284 END DO
285 END DO
286 END DO
287 END DO
288 END DO
289
290 RETURN
291
292
293
logical function sisnan(SIN)
SISNAN tests input for NaN.
subroutine cgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
CGEMM
subroutine clatmr(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)
CLATMR
real function clange(NORM, M, N, A, LDA, WORK)
CLANGE returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute value ...
subroutine clacpy(UPLO, M, N, A, LDA, B, LDB)
CLACPY copies all or part of one two-dimensional array to another.
subroutine ctrsyl(TRANA, TRANB, ISGN, M, N, A, LDA, B, LDB, C, LDC, SCALE, INFO)
CTRSYL
subroutine ctrsyl3(TRANA, TRANB, ISGN, M, N, A, LDA, B, LDB, C, LDC, SCALE, SWORK, LDSWORK, INFO)
CTRSYL3
real function slamch(CMACH)
SLAMCH