00001 SUBROUTINE SLATM4( ITYPE, N, NZ1, NZ2, ISIGN, AMAGN, RCOND,
00002 $ TRIANG, IDIST, ISEED, A, LDA )
00003
00004
00005
00006
00007
00008
00009 INTEGER IDIST, ISIGN, ITYPE, LDA, N, NZ1, NZ2
00010 REAL AMAGN, RCOND, TRIANG
00011
00012
00013 INTEGER ISEED( 4 )
00014 REAL A( LDA, * )
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119 REAL ZERO, ONE, TWO
00120 PARAMETER ( ZERO = 0.0E0, ONE = 1.0E0, TWO = 2.0E0 )
00121 REAL HALF
00122 PARAMETER ( HALF = ONE / TWO )
00123
00124
00125 INTEGER I, IOFF, ISDB, ISDE, JC, JD, JR, K, KBEG, KEND,
00126 $ KLEN
00127 REAL ALPHA, CL, CR, SAFMIN, SL, SR, SV1, SV2, TEMP
00128
00129
00130 REAL SLAMCH, SLARAN, SLARND
00131 EXTERNAL SLAMCH, SLARAN, SLARND
00132
00133
00134 EXTERNAL SLASET
00135
00136
00137 INTRINSIC ABS, EXP, LOG, MAX, MIN, MOD, REAL, SQRT
00138
00139
00140
00141 IF( N.LE.0 )
00142 $ RETURN
00143 CALL SLASET( 'Full', N, N, ZERO, ZERO, A, LDA )
00144
00145
00146
00147 IF( MOD( ISEED( 4 ), 2 ).NE.1 )
00148 $ ISEED( 4 ) = ISEED( 4 ) + 1
00149
00150
00151
00152
00153 IF( ITYPE.NE.0 ) THEN
00154 IF( ABS( ITYPE ).GE.4 ) THEN
00155 KBEG = MAX( 1, MIN( N, NZ1+1 ) )
00156 KEND = MAX( KBEG, MIN( N, N-NZ2 ) )
00157 KLEN = KEND + 1 - KBEG
00158 ELSE
00159 KBEG = 1
00160 KEND = N
00161 KLEN = N
00162 END IF
00163 ISDB = 1
00164 ISDE = 0
00165 GO TO ( 10, 30, 50, 80, 100, 120, 140, 160,
00166 $ 180, 200 )ABS( ITYPE )
00167
00168
00169
00170 10 CONTINUE
00171 DO 20 JD = 1, N
00172 A( JD, JD ) = ONE
00173 20 CONTINUE
00174 GO TO 220
00175
00176
00177
00178 30 CONTINUE
00179 DO 40 JD = 1, N - 1
00180 A( JD+1, JD ) = ONE
00181 40 CONTINUE
00182 ISDB = 1
00183 ISDE = N - 1
00184 GO TO 220
00185
00186
00187
00188
00189 50 CONTINUE
00190 K = ( N-1 ) / 2
00191 DO 60 JD = 1, K
00192 A( JD+1, JD ) = ONE
00193 60 CONTINUE
00194 ISDB = 1
00195 ISDE = K
00196 DO 70 JD = K + 2, 2*K + 1
00197 A( JD, JD ) = ONE
00198 70 CONTINUE
00199 GO TO 220
00200
00201
00202
00203 80 CONTINUE
00204 DO 90 JD = KBEG, KEND
00205 A( JD, JD ) = REAL( JD-NZ1 )
00206 90 CONTINUE
00207 GO TO 220
00208
00209
00210
00211 100 CONTINUE
00212 DO 110 JD = KBEG + 1, KEND
00213 A( JD, JD ) = RCOND
00214 110 CONTINUE
00215 A( KBEG, KBEG ) = ONE
00216 GO TO 220
00217
00218
00219
00220 120 CONTINUE
00221 DO 130 JD = KBEG, KEND - 1
00222 A( JD, JD ) = ONE
00223 130 CONTINUE
00224 A( KEND, KEND ) = RCOND
00225 GO TO 220
00226
00227
00228
00229 140 CONTINUE
00230 A( KBEG, KBEG ) = ONE
00231 IF( KLEN.GT.1 ) THEN
00232 ALPHA = RCOND**( ONE / REAL( KLEN-1 ) )
00233 DO 150 I = 2, KLEN
00234 A( NZ1+I, NZ1+I ) = ALPHA**REAL( I-1 )
00235 150 CONTINUE
00236 END IF
00237 GO TO 220
00238
00239
00240
00241 160 CONTINUE
00242 A( KBEG, KBEG ) = ONE
00243 IF( KLEN.GT.1 ) THEN
00244 ALPHA = ( ONE-RCOND ) / REAL( KLEN-1 )
00245 DO 170 I = 2, KLEN
00246 A( NZ1+I, NZ1+I ) = REAL( KLEN-I )*ALPHA + RCOND
00247 170 CONTINUE
00248 END IF
00249 GO TO 220
00250
00251
00252
00253 180 CONTINUE
00254 ALPHA = LOG( RCOND )
00255 DO 190 JD = KBEG, KEND
00256 A( JD, JD ) = EXP( ALPHA*SLARAN( ISEED ) )
00257 190 CONTINUE
00258 GO TO 220
00259
00260
00261
00262 200 CONTINUE
00263 DO 210 JD = KBEG, KEND
00264 A( JD, JD ) = SLARND( IDIST, ISEED )
00265 210 CONTINUE
00266
00267 220 CONTINUE
00268
00269
00270
00271 DO 230 JD = KBEG, KEND
00272 A( JD, JD ) = AMAGN*REAL( A( JD, JD ) )
00273 230 CONTINUE
00274 DO 240 JD = ISDB, ISDE
00275 A( JD+1, JD ) = AMAGN*REAL( A( JD+1, JD ) )
00276 240 CONTINUE
00277
00278
00279
00280
00281 IF( ISIGN.GT.0 ) THEN
00282 DO 250 JD = KBEG, KEND
00283 IF( REAL( A( JD, JD ) ).NE.ZERO ) THEN
00284 IF( SLARAN( ISEED ).GT.HALF )
00285 $ A( JD, JD ) = -A( JD, JD )
00286 END IF
00287 250 CONTINUE
00288 DO 260 JD = ISDB, ISDE
00289 IF( REAL( A( JD+1, JD ) ).NE.ZERO ) THEN
00290 IF( SLARAN( ISEED ).GT.HALF )
00291 $ A( JD+1, JD ) = -A( JD+1, JD )
00292 END IF
00293 260 CONTINUE
00294 END IF
00295
00296
00297
00298 IF( ITYPE.LT.0 ) THEN
00299 DO 270 JD = KBEG, ( KBEG+KEND-1 ) / 2
00300 TEMP = A( JD, JD )
00301 A( JD, JD ) = A( KBEG+KEND-JD, KBEG+KEND-JD )
00302 A( KBEG+KEND-JD, KBEG+KEND-JD ) = TEMP
00303 270 CONTINUE
00304 DO 280 JD = 1, ( N-1 ) / 2
00305 TEMP = A( JD+1, JD )
00306 A( JD+1, JD ) = A( N+1-JD, N-JD )
00307 A( N+1-JD, N-JD ) = TEMP
00308 280 CONTINUE
00309 END IF
00310
00311
00312
00313
00314 IF( ISIGN.EQ.2 .AND. ITYPE.NE.2 .AND. ITYPE.NE.3 ) THEN
00315 SAFMIN = SLAMCH( 'S' )
00316 DO 290 JD = KBEG, KEND - 1, 2
00317 IF( SLARAN( ISEED ).GT.HALF ) THEN
00318
00319
00320
00321 CL = TWO*SLARAN( ISEED ) - ONE
00322 SL = TWO*SLARAN( ISEED ) - ONE
00323 TEMP = ONE / MAX( SAFMIN, SQRT( CL**2+SL**2 ) )
00324 CL = CL*TEMP
00325 SL = SL*TEMP
00326
00327
00328
00329 CR = TWO*SLARAN( ISEED ) - ONE
00330 SR = TWO*SLARAN( ISEED ) - ONE
00331 TEMP = ONE / MAX( SAFMIN, SQRT( CR**2+SR**2 ) )
00332 CR = CR*TEMP
00333 SR = SR*TEMP
00334
00335
00336
00337 SV1 = A( JD, JD )
00338 SV2 = A( JD+1, JD+1 )
00339 A( JD, JD ) = CL*CR*SV1 + SL*SR*SV2
00340 A( JD+1, JD ) = -SL*CR*SV1 + CL*SR*SV2
00341 A( JD, JD+1 ) = -CL*SR*SV1 + SL*CR*SV2
00342 A( JD+1, JD+1 ) = SL*SR*SV1 + CL*CR*SV2
00343 END IF
00344 290 CONTINUE
00345 END IF
00346
00347 END IF
00348
00349
00350
00351 IF( TRIANG.NE.ZERO ) THEN
00352 IF( ISIGN.NE.2 .OR. ITYPE.EQ.2 .OR. ITYPE.EQ.3 ) THEN
00353 IOFF = 1
00354 ELSE
00355 IOFF = 2
00356 DO 300 JR = 1, N - 1
00357 IF( A( JR+1, JR ).EQ.ZERO )
00358 $ A( JR, JR+1 ) = TRIANG*SLARND( IDIST, ISEED )
00359 300 CONTINUE
00360 END IF
00361
00362 DO 320 JC = 2, N
00363 DO 310 JR = 1, JC - IOFF
00364 A( JR, JC ) = TRIANG*SLARND( IDIST, ISEED )
00365 310 CONTINUE
00366 320 CONTINUE
00367 END IF
00368
00369 RETURN
00370
00371
00372
00373 END