173 SUBROUTINE dlatm4( ITYPE, N, NZ1, NZ2, ISIGN, AMAGN, RCOND,
174 $ TRIANG, IDIST, ISEED, A, LDA )
181 INTEGER IDIST, ISIGN, ITYPE, LDA, N, NZ1, NZ2
182 DOUBLE PRECISION AMAGN, RCOND, TRIANG
186 DOUBLE PRECISION A( LDA, * )
192 DOUBLE PRECISION ZERO, ONE, TWO
193 parameter( zero = 0.0d0, one = 1.0d0, two = 2.0d0 )
194 DOUBLE PRECISION HALF
195 parameter( half = one / two )
198 INTEGER I, IOFF, ISDB, ISDE, JC, JD, JR, K, KBEG, KEND,
200 DOUBLE PRECISION ALPHA, CL, CR, SAFMIN, SL, SR, SV1, SV2, TEMP
203 DOUBLE PRECISION DLAMCH, , DLARND
204 EXTERNAL dlamch,
dlaran, dlarnd
210 INTRINSIC abs, dble, exp, log,
max,
min, mod, sqrt
216 CALL dlaset(
'Full', n, n, zero, zero, a, lda )
220 IF( mod( iseed( 4 ), 2 ).NE.1 )
221 $ iseed( 4 ) = iseed( 4 ) + 1
226 IF( itype.NE.0 )
THEN
227 IF( abs( itype ).GE.4 )
THEN
228 kbeg =
max( 1,
min( n, nz1+1 ) )
229 kend =
max( kbeg,
min( n, n-nz2 ) )
230 klen = kend + 1 - kbeg
238 GO TO ( 10, 30, 50, 80, 100, 120, 140, 160,
239 $ 180, 200 )abs( itype )
269 DO 70 jd = k + 2, 2*k + 1
277 DO 90 jd = kbeg, kend
278 a( jd, jd ) = dble( jd-nz1 )
285 DO 110 jd = kbeg + 1, kend
288 a( kbeg, kbeg ) = one
294 DO 130 jd = kbeg, kend - 1
297 a( kend, kend ) = rcond
303 a( kbeg, kbeg ) = one
305 alpha = rcond**( one / dble( klen-1 ) )
307 a( nz1+i, nz1+i ) = alpha**dble( i-1 )
315 a( kbeg, kbeg ) = one
317 alpha = ( one-rcond ) / dble( klen-1 )
319 a( nz1+i, nz1+i ) = dble( klen-i )*alpha + rcond
328 DO 190 jd = kbeg, kend
329 a( jd, jd ) = exp( alpha*
dlaran( iseed ) )
336 DO 210 jd = kbeg, kend
337 a( jd, jd ) = dlarnd( idist, iseed )
344 DO 230 jd = kbeg, kend
345 a( jd, jd ) = amagn*dble( a( jd, jd ) )
347 DO 240 jd = isdb, isde
348 a( jd+1, jd ) = amagn*dble( a( jd+1, jd ) )
354 IF( isign.GT.0 )
THEN
355 DO 250 jd = kbeg, kend
356 IF( dble( a( jd, jd ) ).NE.zero )
THEN
357 IF(
dlaran( iseed ).GT.half )
358 $ a( jd, jd ) = -a( jd, jd )
361 DO 260 jd = isdb, isde
362 IF( dble( a( jd+1, jd ) ).NE.zero )
THEN
363 IF(
dlaran( iseed ).GT.half )
364 $ a( jd+1, jd ) = -a( jd+1, jd )
371 IF( itype.LT.0 )
THEN
372 DO 270 jd = kbeg, ( kbeg+kend-1 ) / 2
374 a( jd, jd ) = a( kbeg+kend-jd, kbeg+kend-jd )
375 a( kbeg+kend-jd, kbeg+kend-jd ) = temp
377 DO 280 jd = 1, ( n-1 ) / 2
379 a( jd+1, jd ) = a( n+1-jd, n-jd )
380 a( n+1-jd, n-jd ) = temp
387 IF( isign.EQ.2 .AND. itype.NE.2 .AND. itype.NE.3 )
THEN
388 safmin = dlamch(
'S' )
389 DO 290 jd = kbeg, kend - 1, 2
390 IF(
dlaran( iseed ).GT.half )
THEN
394 cl = two*
dlaran( iseed ) - one
395 sl = two*
dlaran( iseed ) - one
396 temp = one /
max( safmin, sqrt( cl**2+sl**2 ) )
402 cr = two*
dlaran( iseed ) - one
403 sr = two*
dlaran( iseed ) - one
404 temp = one /
max( safmin, sqrt( cr**2+sr**2 ) )
411 sv2 = a( jd+1, jd+1 )
412 a( jd, jd ) = cl*cr*sv1 + sl*sr*sv2
413 a( jd+1, jd ) = -sl*cr*sv1 + cl*sr*sv2
414 a( jd, jd+1 ) = -cl*sr*sv1 + sl*cr*sv2
415 a( jd+1, jd+1 ) = sl*sr*sv1 + cl*cr*sv2
424 IF( triang.NE.zero )
THEN
425 IF( isign.NE.2 .OR. itype.EQ.2 .OR. itype.EQ.3 )
THEN
430 IF( a( jr+1, jr ).EQ.zero )
431 $ a( jr, jr+1 ) = triang*dlarnd( idist, iseed )
436 DO 310 jr = 1, jc - ioff
437 a( jr, jc ) = triang*dlarnd( idist, iseed )