8244
8245
8246
8247
8248
8249
8250
8251 LOGICAL INPLACE
8252 INTEGER IA, JA, N
8253 REAL ALPHA
8254
8255
8256 INTEGER DESCA( * )
8257 REAL A( * )
8258
8259
8260
8261
8262
8263
8264
8265
8266
8267
8268
8269
8270
8271
8272
8273
8274
8275
8276
8277
8278
8279
8280
8281
8282
8283
8284
8285
8286
8287
8288
8289
8290
8291
8292
8293
8294
8295
8296
8297
8298
8299
8300
8301
8302
8303
8304
8305
8306
8307
8308
8309
8310
8311
8312
8313
8314
8315
8316
8317
8318
8319
8320
8321
8322
8323
8324
8325
8326
8327
8328
8329
8330
8331
8332
8333
8334
8335
8336
8337
8338
8339
8340
8341
8342
8343
8344
8345
8346
8347
8348
8349
8350
8351
8352
8353
8354
8355
8356
8357
8358
8359
8360
8361
8362
8363
8364
8365
8366
8367
8368
8369
8370
8371 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
8372 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
8373 $ RSRC_
8374 parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
8375 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
8376 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
8377 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
8378
8379
8380 LOGICAL GODOWN, GOLEFT
8381 INTEGER I, IACOL, IAROW, ICTXT, IIA, IJOFFA, ILOW,
8382 $ IMB1, IMBLOC, INB1, INBLOC, IOFFA, IOFFD, IUPP,
8383 $ JJA, JOFFA, JOFFD, LCMT, LCMT00, LDA, LDAP1,
8384 $ LMBLOC, LNBLOC, LOW, MB, MBLKD, MBLKS, MBLOC,
8385 $ MRCOL, MRROW, MYCOL, MYROW, NB, NBLKD, NBLKS,
8386 $ NBLOC, NP, NPCOL, NPROW, NQ, PMB, QNB, UPP
8387 REAL ATMP
8388
8389
8390 INTEGER DESCA2( DLEN_ )
8391
8392
8395
8396
8398
8399
8400
8401
8402
8404
8405
8406
8407 ictxt = desca2( ctxt_ )
8408 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
8409
8410 IF( n.EQ.0 )
8411 $ RETURN
8412
8413 CALL pb_ainfog2l( n, n, ia, ja, desca2, nprow, npcol, myrow,
8414 $ mycol, imb1, inb1, np, nq, iia, jja, iarow,
8415 $ iacol, mrrow, mrcol )
8416
8417
8418
8419 IF( inplace ) THEN
8420 iia = 1
8421 jja = 1
8422 END IF
8423
8424
8425
8426
8427 mb = desca2( mb_ )
8428 nb = desca2( nb_ )
8429
8430 CALL pb_binfo( 0, np, nq, imb1, inb1, mb, nb, mrrow, mrcol,
8431 $ lcmt00, mblks, nblks, imbloc, inbloc, lmbloc,
8432 $ lnbloc, ilow, low, iupp, upp )
8433
8434 ioffa = iia - 1
8435 joffa = jja - 1
8436 lda = desca2( lld_ )
8437 ldap1 = lda + 1
8438
8439 IF( desca2( rsrc_ ).LT.0 ) THEN
8440 pmb = mb
8441 ELSE
8442 pmb = nprow * mb
8443 END IF
8444 IF( desca2( csrc_ ).LT.0 ) THEN
8445 qnb = nb
8446 ELSE
8447 qnb = npcol * nb
8448 END IF
8449
8450
8451
8452
8453 godown = ( lcmt00.GT.iupp )
8454 goleft = ( lcmt00.LT.ilow )
8455
8456 IF( .NOT.godown .AND. .NOT.goleft ) THEN
8457
8458
8459
8460 IF( lcmt00.GE.0 ) THEN
8461 ijoffa = ioffa+lcmt00 + ( joffa - 1 ) * lda
8462 DO 10 i = 1,
min( inbloc,
max( 0, imbloc - lcmt00 ) )
8463 atmp = a( ijoffa + i*ldap1 )
8464 a( ijoffa + i*ldap1 ) = abs( atmp ) + alpha
8465 10 CONTINUE
8466 ELSE
8467 ijoffa = ioffa + ( joffa - lcmt00 - 1 ) * lda
8468 DO 20 i = 1,
min( imbloc,
max( 0, inbloc + lcmt00 ) )
8469 atmp = a( ijoffa + i*ldap1 )
8470 a( ijoffa + i*ldap1 ) = abs( atmp ) + alpha
8471 20 CONTINUE
8472 END IF
8473 goleft = ( ( lcmt00 - ( iupp - upp + pmb ) ).LT.ilow )
8474 godown = .NOT.goleft
8475
8476 END IF
8477
8478 IF( godown ) THEN
8479
8480 lcmt00 = lcmt00 - ( iupp - upp + pmb )
8481 mblks = mblks - 1
8482 ioffa = ioffa + imbloc
8483
8484 30 CONTINUE
8485 IF( mblks.GT.0 .AND. lcmt00.GT.upp ) THEN
8486 lcmt00 = lcmt00 - pmb
8487 mblks = mblks - 1
8488 ioffa = ioffa + mb
8489 GO TO 30
8490 END IF
8491
8492 lcmt = lcmt00
8493 mblkd = mblks
8494 ioffd = ioffa
8495
8496 mbloc = mb
8497 40 CONTINUE
8498 IF( mblkd.GT.0 .AND. lcmt.GE.ilow ) THEN
8499 IF( mblkd.EQ.1 )
8500 $ mbloc = lmbloc
8501 IF( lcmt.GE.0 ) THEN
8502 ijoffa = ioffd + lcmt + ( joffa - 1 ) * lda
8503 DO 50 i = 1,
min( inbloc,
max( 0, mbloc - lcmt ) )
8504 atmp = a( ijoffa + i*ldap1 )
8505 a( ijoffa + i*ldap1 ) = abs( atmp ) + alpha
8506 50 CONTINUE
8507 ELSE
8508 ijoffa = ioffd + ( joffa - lcmt - 1 ) * lda
8509 DO 60 i = 1,
min( mbloc,
max( 0, inbloc + lcmt ) )
8510 atmp = a( ijoffa + i*ldap1 )
8511 a( ijoffa + i*ldap1 ) = abs( atmp ) + alpha
8512 60 CONTINUE
8513 END IF
8514 lcmt00 = lcmt
8515 lcmt = lcmt - pmb
8516 mblks = mblkd
8517 mblkd = mblkd - 1
8518 ioffa = ioffd
8519 ioffd = ioffd + mbloc
8520 GO TO 40
8521 END IF
8522
8523 lcmt00 = lcmt00 + low - ilow + qnb
8524 nblks = nblks - 1
8525 joffa = joffa + inbloc
8526
8527 ELSE IF( goleft ) THEN
8528
8529 lcmt00 = lcmt00 + low - ilow + qnb
8530 nblks = nblks - 1
8531 joffa = joffa + inbloc
8532
8533 70 CONTINUE
8534 IF( nblks.GT.0 .AND. lcmt00.LT.low ) THEN
8535 lcmt00 = lcmt00 + qnb
8536 nblks = nblks - 1
8537 joffa = joffa + nb
8538 GO TO 70
8539 END IF
8540
8541 lcmt = lcmt00
8542 nblkd = nblks
8543 joffd = joffa
8544
8545 nbloc = nb
8546 80 CONTINUE
8547 IF( nblkd.GT.0 .AND. lcmt.LE.iupp ) THEN
8548 IF( nblkd.EQ.1 )
8549 $ nbloc = lnbloc
8550 IF( lcmt.GE.0 ) THEN
8551 ijoffa = ioffa + lcmt + ( joffd - 1 ) * lda
8552 DO 90 i = 1,
min( nbloc,
max( 0, imbloc - lcmt ) )
8553 atmp = a( ijoffa + i*ldap1 )
8554 a( ijoffa + i*ldap1 ) = abs( atmp ) + alpha
8555 90 CONTINUE
8556 ELSE
8557 ijoffa = ioffa + ( joffd - lcmt - 1 ) * lda
8558 DO 100 i = 1,
min( imbloc,
max( 0, nbloc + lcmt ) )
8559 atmp = a( ijoffa + i*ldap1 )
8560 a( ijoffa + i*ldap1 ) = abs( atmp ) + alpha
8561 100 CONTINUE
8562 END IF
8563 lcmt00 = lcmt
8564 lcmt = lcmt + qnb
8565 nblks = nblkd
8566 nblkd = nblkd - 1
8567 joffa = joffd
8568 joffd = joffd + nbloc
8569 GO TO 80
8570 END IF
8571
8572 lcmt00 = lcmt00 - ( iupp - upp + pmb )
8573 mblks = mblks - 1
8574 ioffa = ioffa + imbloc
8575
8576 END IF
8577
8578 nbloc = nb
8579 110 CONTINUE
8580 IF( nblks.GT.0 ) THEN
8581 IF( nblks.EQ.1 )
8582 $ nbloc = lnbloc
8583 120 CONTINUE
8584 IF( mblks.GT.0 .AND. lcmt00.GT.upp ) THEN
8585 lcmt00 = lcmt00 - pmb
8586 mblks = mblks - 1
8587 ioffa = ioffa + mb
8588 GO TO 120
8589 END IF
8590
8591 lcmt = lcmt00
8592 mblkd = mblks
8593 ioffd = ioffa
8594
8595 mbloc = mb
8596 130 CONTINUE
8597 IF( mblkd.GT.0 .AND. lcmt.GE.low ) THEN
8598 IF( mblkd.EQ.1 )
8599 $ mbloc = lmbloc
8600 IF( lcmt.GE.0 ) THEN
8601 ijoffa = ioffd + lcmt + ( joffa - 1 ) * lda
8602 DO 140 i = 1,
min( nbloc,
max( 0, mbloc - lcmt ) )
8603 atmp = a( ijoffa + i*ldap1 )
8604 a( ijoffa + i*ldap1 ) = abs( atmp ) + alpha
8605 140 CONTINUE
8606 ELSE
8607 ijoffa = ioffd + ( joffa - lcmt - 1 ) * lda
8608 DO 150 i = 1,
min( mbloc,
max( 0, nbloc + lcmt ) )
8609 atmp = a( ijoffa + i*ldap1 )
8610 a( ijoffa + i*ldap1 ) = abs( atmp ) + alpha
8611 150 CONTINUE
8612 END IF
8613 lcmt00 = lcmt
8614 lcmt = lcmt - pmb
8615 mblks = mblkd
8616 mblkd = mblkd - 1
8617 ioffa = ioffd
8618 ioffd = ioffd + mbloc
8619 GO TO 130
8620 END IF
8621
8622 lcmt00 = lcmt00 + qnb
8623 nblks = nblks - 1
8624 joffa = joffa + nbloc
8625 GO TO 110
8626
8627 END IF
8628
8629 RETURN
8630
8631
8632
subroutine pb_ainfog2l(m, n, i, j, desc, nprow, npcol, myrow, mycol, imb1, inb1, mp, nq, ii, jj, prow, pcol, rprow, rpcol)
subroutine pb_binfo(offd, m, n, imb1, inb1, mb, nb, mrrow, mrcol, lcmt00, mblks, nblks, imbloc, inbloc, lmbloc, lnbloc, ilow, low, iupp, upp)
subroutine pb_desctrans(descin, descout)