1 SUBROUTINE psmatgen( ICTXT, AFORM, DIAG, M, N, MB, NB, A, LDA,
2 $ IAROW, IACOL, ISEED, IROFF, IRNUM, ICOFF,
3 $ ICNUM, MYROW, MYCOL, NPROW, NPCOL )
115 INTEGER MULT0, MULT1, IADD0, IADD1
119 PARAMETER ( ONE = 1.0e+0, two = 2.0e+0 )
122 LOGICAL SYMM, HERM, TRAN
123 INTEGER , INFO, IOFFC, IOFFR, IR, J, JK,
124 $ jump1, jump2, jump3, jump4, jump5, jump6,
125 $ jump7, maxmn, mend, moff, mp, mrcol, mrrow,
126 $ nend, noff, npmb, nq, nqnb
129 INTEGER IADD(2), IA1(2), IA2(
132 $ iran3(2), iran4(2), itmp1(2), itmp2(2),
133 $ itmp3(2), jseed(2), mult(2)
139 INTRINSIC abs,
max, mod
143 INTEGER ICEIL, NUMROC
145 EXTERNAL iceil, numroc, lsame, psrand
151 mp = numroc( m, mb, myrow, iarow, nprow )
152 nq = numroc( n, nb, mycol, iacol, npcol )
153 symm = lsame( aform,
'S' )
154 herm = lsame( aform, 'h
' )
155 TRAN = LSAME( AFORM, 't
' )
158.NOT.
IF( LSAME( DIAG, 'd.AND.
' )
159.NOT.
$ LSAME( DIAG, 'n
' ) ) THEN
161.OR.
ELSE IF( SYMMHERM ) THEN
164.NE.
ELSE IF( MBNB ) THEN
167.LT.
ELSE IF( M0 ) THEN
169.LT.
ELSE IF( N0 ) THEN
171.LT.
ELSE IF( MB1 ) THEN
173.LT.
ELSE IF( NB1 ) THEN
175.LT.
ELSE IF( LDA0 ) THEN
177.LT..OR..GE.
ELSE IF( ( IAROW0 )( IAROWNPROW ) ) THEN
179.LT..OR..GE.
ELSE IF( ( IACOL0 )( IACOLNPCOL ) ) THEN
181.GT.
ELSE IF( MOD(IROFF,MB)0 ) THEN
183.GT.
ELSE IF( IRNUM(MP-IROFF) ) THEN
185.GT.
ELSE IF( MOD(ICOFF,NB)0 ) THEN
187.GT.
ELSE IF( ICNUM(NQ-ICOFF) ) THEN
189.LT..OR..GE.
ELSE IF( ( MYROW0 )( MYROWNPROW ) ) THEN
191.LT..OR..GE.
ELSE IF( ( MYCOL0 )( MYCOLNPCOL ) ) THEN
195 CALL PXERBLA( ICTXT, 'psmatgen', INFO )
199 MRROW = MOD( NPROW+MYROW-IAROW, NPROW )
200 MRCOL = MOD( NPCOL+MYCOL-IACOL, NPCOL )
205 MEND = ICEIL(IRNUM, MB) + MOFF
206 NEND = ICEIL(ICNUM, NB) + NOFF
217.OR.
IF( SYMMHERM ) THEN
229 CALL XJUMPM( JUMP1, MULT, IADD, JSEED, IRAN1, IA1, IC1 )
230 CALL XJUMPM( JUMP2, MULT, IADD, IRAN1, ITMP1, IA2, IC2 )
231 CALL XJUMPM( JUMP3, MULT, IADD, IRAN1, ITMP1, IA3, IC3 )
232 CALL XJUMPM( JUMP4, IA3, IC3, IRAN1, ITMP1, IA4, IC4 )
233 CALL XJUMPM( JUMP5, IA3, IC3, IRAN1, ITMP1, IA5, IC5 )
234 CALL XJUMPM( JUMP6, IA5, IC5, IRAN1, ITMP3, ITMP1, ITMP2 )
235 CALL XJUMPM( JUMP7, MULT, IADD, ITMP3, IRAN1, ITMP1, ITMP2 )
236 CALL XJUMPM( NOFF, IA4, IC4, IRAN1, ITMP1, ITMP2, ITMP3 )
237 CALL XJUMPM( MOFF, IA2, IC2, ITMP1, IRAN1, ITMP2, ITMP3 )
238 CALL SETRAN( IRAN1, IA1, IC1 )
247 DO 80 IC = NOFF+1, NEND
248 IOFFC = ((IC-1)*NPCOL+MRCOL) * NB
250.GT.
IF( JK ICNUM ) GO TO 90
253 DO 50 IR = MOFF+1, MEND
254 IOFFR = ((IR-1)*NPROW+MRROW) * MB
256.GT.
IF( IOFFR IOFFC ) THEN
258.GT.
IF( IK IRNUM ) GO TO 60
259 A(IK,JK) = ONE - TWO*PSRAND(0)
263.EQ.
ELSE IF( IOFFC IOFFR ) THEN
265.GT.
IF( IK IRNUM ) GO TO 60
267 A(IK,JK) = ONE - TWO*PSRAND(0)
269 A(IK,JK) = ONE - TWO*PSRAND(0)
271.GT.
IF( IK+J IRNUM ) GO TO 60
272 A(IK+J,JK) = ONE - TWO*PSRAND(0)
273 A(IK,JK+J) = A(IK+J,JK)
280 CALL JUMPIT( IA2, IC2, IB1, IRAN2 )
287 CALL JUMPIT( IA3, IC3, IB2, IRAN3 )
294 CALL JUMPIT( IA4, IC4, IB3, IRAN4 )
321 CALL XJUMPM( JUMP1, MULT, IADD, JSEED, IRAN1, IA1, IC1 )
322 CALL XJUMPM( JUMP2, MULT, IADD, IRAN1, ITMP1, IA2, IC2 )
323 CALL XJUMPM( JUMP3, MULT, IADD, IRAN1, ITMP1, IA3, IC3 )
324 CALL XJUMPM( JUMP4, IA3, IC3, IRAN1, ITMP1, IA4, IC4 )
325 CALL XJUMPM( JUMP5, IA3, IC3, IRAN1, ITMP1, IA5, IC5 )
326 CALL XJUMPM( JUMP6, IA5, IC5, IRAN1, ITMP3, ITMP1, ITMP2 )
327 CALL XJUMPM( JUMP7, MULT, IADD, ITMP3, IRAN1, ITMP1, ITMP2 )
328 CALL XJUMPM( MOFF, IA4, IC4, IRAN1, ITMP1, ITMP2, ITMP3 )
329 CALL XJUMPM( NOFF, IA2, IC2, ITMP1, IRAN1, ITMP2, ITMP3 )
330 CALL SETRAN( IRAN1, IA1, IC1 )
339 DO 150 IR = MOFF+1, MEND
340 IOFFR = ((IR-1)*NPROW+MRROW) * MB
342.GT.
IF( IK IRNUM ) GO TO 160
344 DO 120 IC = NOFF+1, NEND
345 IOFFC = ((IC-1)*NPCOL+MRCOL) * NB
346.GT.
IF( IOFFC IOFFR ) THEN
348.GT.
IF( JK ICNUM ) GO TO 130
349 A(IK,JK) = ONE - TWO*PSRAND(0)
355 CALL JUMPIT( IA2, IC2, IB1, IRAN2 )
362 CALL JUMPIT( IA3, IC3, IB2, IRAN3 )
369 CALL JUMPIT( IA4, IC4, IB3, IRAN4 )
381.OR.
ELSE IF( TRAN LSAME( AFORM, 'c
' ) ) THEN
391 CALL XJUMPM( JUMP1, MULT, IADD, JSEED, IRAN1, IA1, IC1 )
392 CALL XJUMPM( JUMP2, MULT, IADD, IRAN1, ITMP1, IA2, IC2 )
393 CALL XJUMPM( JUMP3, MULT, IADD, IRAN1, ITMP1, IA3, IC3 )
394 CALL XJUMPM( JUMP4, IA3, IC3, IRAN1, ITMP1, IA4, IC4 )
395 CALL XJUMPM( JUMP5, IA3, IC3, IRAN1, ITMP1, IA5, IC5 )
396 CALL XJUMPM( JUMP6, IA5, IC5, IRAN1, ITMP3, ITMP1, ITMP2 )
397 CALL XJUMPM( JUMP7, MULT, IADD, ITMP3, IRAN1, ITMP1, ITMP2 )
398 CALL XJUMPM( MOFF, IA4, IC4, IRAN1, ITMP1, ITMP2, ITMP3 )
399 CALL XJUMPM( NOFF, IA2, IC2, ITMP1, IRAN1, ITMP2, ITMP3 )
400 CALL SETRAN( IRAN1, IA1, IC1 )
409 DO 220 IR = MOFF+1, MEND
410 IOFFR = ((IR-1)*NPROW+MRROW) * MB
412.GT.
IF( IK IRNUM ) GO TO 230
414 DO 190 IC = NOFF+1, NEND
415 IOFFC = ((IC-1)*NPCOL+MRCOL) * NB
417.GT.
IF( JK ICNUM ) GO TO 200
418 A(IK,JK) = ONE - TWO*PSRAND(0)
421 CALL JUMPIT( IA2, IC2, IB1, IRAN2 )
428 CALL JUMPIT( IA3, IC3, IB2, IRAN3 )
435 CALL JUMPIT( IA4, IC4, IB3, IRAN4 )
457 CALL XJUMPM( JUMP1, MULT, IADD, JSEED, IRAN1, IA1, IC1 )
458 CALL XJUMPM( JUMP2, MULT, IADD, IRAN1, ITMP1, IA2, IC2 )
459 CALL XJUMPM( JUMP3, MULT, IADD, IRAN1, ITMP1, IA3, IC3 )
460 CALL XJUMPM( JUMP4, IA3, IC3, IRAN1, ITMP1, IA4, IC4 )
461 CALL XJUMPM( JUMP5, IA3, IC3, IRAN1, ITMP1, IA5, IC5 )
462 CALL XJUMPM( JUMP6, IA5, IC5, IRAN1, ITMP3, ITMP1, ITMP2 )
463 CALL XJUMPM( JUMP7, MULT, IADD, ITMP3, IRAN1, ITMP1, ITMP2 )
464 CALL XJUMPM( NOFF, IA4, IC4, IRAN1, ITMP1, ITMP2, ITMP3 )
465 CALL XJUMPM( MOFF, IA2, IC2, ITMP1, IRAN1, ITMP2, ITMP3 )
466 CALL SETRAN( IRAN1, IA1, IC1 )
475 DO 290 IC = NOFF+1, NEND
476 IOFFC = ((IC-1)*NPCOL+MRCOL) * NB
478.GT.
IF( JK ICNUM ) GO TO 300
480 DO 260 IR = MOFF+1, MEND
481 IOFFR = ((IR-1)*NPROW+MRROW) * MB
483.GT.
IF( IK IRNUM ) GO TO 270
484 A(IK,JK) = ONE - TWO*PSRAND(0)
487 CALL JUMPIT( IA2, IC2, IB1, IRAN2 )
494 CALL JUMPIT( IA3, IC3, IB2, IRAN3 )
501 CALL JUMPIT( IA4, IC4, IB3, IRAN4 )
514 IF( LSAME( DIAG, 'd
' ) ) THEN
516 WRITE(*,*) 'diagonally dominant matrices with rownb not
'//
517 $ ' equal colnb is not supported
523 DO 340 ic = noff+1, nend
524 ioffc = ((ic-1)*npcol+mrcol) * nb
526 DO 320 ir = moff+1, mend
527 ioffr = ((ir-1)*nprow+mrrow) * mb
528 IF( ioffc.EQ.ioffr )
THEN
530 IF( ik .GT. irnum )
GO TO 330
subroutine psmatgen(ictxt, aform, diag, m, n, mb, nb, a, lda, iarow, iacol, iseed, iroff, irnum, icoff, icnum, myrow, mycol, nprow, npcol)