7338
7339
7340
7341
7342
7343
7344
7345 CHARACTER*1 TYPE
7346 INTEGER IA, JA, M, N
7347 REAL ALPHA
7348
7349
7350 INTEGER DESCA( * )
7351 REAL A( * )
7352
7353
7354
7355
7356
7357
7358
7359
7360
7361
7362
7363
7364
7365
7366
7367
7368
7369
7370
7371
7372
7373
7374
7375
7376
7377
7378
7379
7380
7381
7382
7383
7384
7385
7386
7387
7388
7389
7390
7391
7392
7393
7394
7395
7396
7397
7398
7399
7400
7401
7402
7403
7404
7405
7406
7407
7408
7409
7410
7411
7412
7413
7414
7415
7416
7417
7418
7419
7420
7421
7422
7423
7424
7425
7426
7427
7428
7429
7430
7431
7432
7433
7434
7435
7436
7437
7438
7439
7440
7441
7442
7443
7444
7445
7446
7447
7448
7449
7450
7451
7452
7453
7454
7455
7456
7457
7458
7459
7460
7461
7462
7463
7464
7465
7466
7467
7468
7469
7470
7471
7472 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
7473 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
7474 $ RSRC_
7475 parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
7476 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
7477 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
7478 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
7479
7480
7481 CHARACTER*1 UPLO
7482 LOGICAL GODOWN, GOLEFT, LOWER, UPPER
7483 INTEGER IACOL, IAROW, ICTXT, IIA, IIMAX, ILOW, IMB1,
7484 $ IMBLOC, INB1, INBLOC, IOFFA, IOFFD, ITYPE,
7485 $ IUPP, JJA, JJMAX, JOFFA, JOFFD, LCMT, LCMT00,
7486 $ LDA, LMBLOC, LNBLOC, LOW, M1, MB, MBLKD, MBLKS,
7487 $ MBLOC, MP, MRCOL, MRROW, MYCOL, MYROW, N1, NB,
7488 $ NBLKD, NBLKS, NBLOC, NPCOL, NPROW, NQ, PMB,
7489 $ QNB, TMP1, UPP
7490
7491
7492 INTEGER DESCA2( DLEN_ )
7493
7494
7497
7498
7499 LOGICAL LSAME
7500 INTEGER PB_NUMROC
7502
7503
7505
7506
7507
7508
7509
7511
7512
7513
7514 ictxt = desca2( ctxt_ )
7515 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
7516
7517
7518
7519 IF( m.EQ.0 .OR. n.EQ.0 )
7520 $ RETURN
7521
7522 IF(
lsame(
TYPE,
'L' ) ) THEN
7523 itype = 1
7524 uplo = TYPE
7525 upper = .false.
7526 lower = .true.
7527 ioffd = 0
7528 ELSE IF(
lsame(
TYPE,
'U' ) ) THEN
7529 itype = 2
7530 uplo = TYPE
7531 upper = .true.
7532 lower = .false.
7533 ioffd = 0
7534 ELSE IF(
lsame(
TYPE,
'H' ) ) THEN
7535 itype = 3
7536 uplo = 'U'
7537 upper = .true.
7538 lower = .false.
7539 ioffd = 1
7540 ELSE
7541 itype = 0
7542 uplo = 'A'
7543 upper = .true.
7544 lower = .true.
7545 ioffd = 0
7546 END IF
7547
7548
7549
7550 IF( itype.EQ.0 ) THEN
7551
7552
7553
7554 CALL pb_infog2l( ia, ja, desca2, nprow, npcol, myrow, mycol,
7555 $ iia, jja, iarow, iacol )
7556 mp =
pb_numroc( m, ia, desca2( imb_ ), desca2( mb_ ), myrow,
7557 $ desca2( rsrc_ ), nprow )
7558 nq =
pb_numroc( n, ja, desca2( inb_ ), desca2( nb_ ), mycol,
7559 $ desca2( csrc_ ), npcol )
7560
7561 IF( mp.LE.0 .OR. nq.LE.0 )
7562 $ RETURN
7563
7564 lda = desca2( lld_ )
7565 ioffa = iia + ( jja - 1 ) * lda
7566
7567 CALL pb_slascal(
'All', mp, nq, 0, alpha, a( ioffa ), lda )
7568
7569 ELSE
7570
7571
7572
7573 CALL pb_ainfog2l( m, n, ia, ja, desca2, nprow, npcol, myrow,
7574 $ mycol, imb1, inb1, mp, nq, iia, jja, iarow,
7575 $ iacol, mrrow, mrcol )
7576
7577 IF( mp.LE.0 .OR. nq.LE.0 )
7578 $ RETURN
7579
7580
7581
7582
7583 mb = desca2( mb_ )
7584 nb = desca2( nb_ )
7585 lda = desca2( lld_ )
7586
7587 CALL pb_binfo( ioffd, mp, nq, imb1, inb1, mb, nb, mrrow,
7588 $ mrcol, lcmt00, mblks, nblks, imbloc, inbloc,
7589 $ lmbloc, lnbloc, ilow, low, iupp, upp )
7590
7591 m1 = mp
7592 n1 = nq
7593 ioffa = iia - 1
7594 joffa = jja - 1
7595 iimax = ioffa + mp
7596 jjmax = joffa + nq
7597
7598 IF( desca2( rsrc_ ).LT.0 ) THEN
7599 pmb = mb
7600 ELSE
7601 pmb = nprow * mb
7602 END IF
7603 IF( desca2( csrc_ ).LT.0 ) THEN
7604 qnb = nb
7605 ELSE
7606 qnb = npcol * nb
7607 END IF
7608
7609
7610
7611
7612 godown = ( lcmt00.GT.iupp )
7613 goleft = ( lcmt00.LT.ilow )
7614
7615 IF( .NOT.godown .AND. .NOT.goleft ) THEN
7616
7617
7618
7619 goleft = ( ( lcmt00 - ( iupp - upp + pmb ) ).LT.ilow )
7620 godown = .NOT.goleft
7621
7622 CALL pb_slascal( uplo, imbloc, inbloc, lcmt00, alpha,
7623 $ a( iia+joffa*lda ), lda )
7624 IF( godown ) THEN
7625 IF( upper .AND. nq.GT.inbloc )
7626 $
CALL pb_slascal(
'All', imbloc, nq-inbloc, 0, alpha,
7627 $ a( iia+(joffa+inbloc)*lda ), lda )
7628 iia = iia + imbloc
7629 m1 = m1 - imbloc
7630 ELSE
7631 IF( lower .AND. mp.GT.imbloc )
7632 $
CALL pb_slascal(
'All', mp-imbloc, inbloc, 0, alpha,
7633 $ a( iia+imbloc+joffa*lda ), lda )
7634 jja = jja + inbloc
7635 n1 = n1 - inbloc
7636 END IF
7637
7638 END IF
7639
7640 IF( godown ) THEN
7641
7642 lcmt00 = lcmt00 - ( iupp - upp + pmb )
7643 mblks = mblks - 1
7644 ioffa = ioffa + imbloc
7645
7646 10 CONTINUE
7647 IF( mblks.GT.0 .AND. lcmt00.GT.upp ) THEN
7648 lcmt00 = lcmt00 - pmb
7649 mblks = mblks - 1
7650 ioffa = ioffa + mb
7651 GO TO 10
7652 END IF
7653
7654 tmp1 =
min( ioffa, iimax ) - iia + 1
7655 IF( upper .AND. tmp1.GT.0 ) THEN
7657 $ a( iia+joffa*lda ), lda )
7658 iia = iia + tmp1
7659 m1 = m1 - tmp1
7660 END IF
7661
7662 IF( mblks.LE.0 )
7663 $ RETURN
7664
7665 lcmt = lcmt00
7666 mblkd = mblks
7667 ioffd = ioffa
7668
7669 mbloc = mb
7670 20 CONTINUE
7671 IF( mblkd.GT.0 .AND. lcmt.GE.ilow ) THEN
7672 IF( mblkd.EQ.1 )
7673 $ mbloc = lmbloc
7674 CALL pb_slascal( uplo, mbloc, inbloc, lcmt, alpha,
7675 $ a( ioffd+1+joffa*lda ), lda )
7676 lcmt00 = lcmt
7677 lcmt = lcmt - pmb
7678 mblks = mblkd
7679 mblkd = mblkd - 1
7680 ioffa = ioffd
7681 ioffd = ioffd + mbloc
7682 GO TO 20
7683 END IF
7684
7685 tmp1 = m1 - ioffd + iia - 1
7686 IF( lower .AND. tmp1.GT.0 )
7687 $
CALL pb_slascal(
'All', tmp1, inbloc, 0, alpha,
7688 $ a( ioffd+1+joffa*lda ), lda )
7689
7690 tmp1 = ioffa - iia + 1
7691 m1 = m1 - tmp1
7692 n1 = n1 - inbloc
7693 lcmt00 = lcmt00 + low - ilow + qnb
7694 nblks = nblks - 1
7695 joffa = joffa + inbloc
7696
7697 IF( upper .AND. tmp1.GT.0 .AND. n1.GT.0 )
7698 $
CALL pb_slascal(
'All', tmp1, n1, 0, alpha,
7699 $ a( iia+joffa*lda ), lda )
7700
7701 iia = ioffa + 1
7702 jja = joffa + 1
7703
7704 ELSE IF( goleft ) THEN
7705
7706 lcmt00 = lcmt00 + low - ilow + qnb
7707 nblks = nblks - 1
7708 joffa = joffa + inbloc
7709
7710 30 CONTINUE
7711 IF( nblks.GT.0 .AND. lcmt00.LT.low ) THEN
7712 lcmt00 = lcmt00 + qnb
7713 nblks = nblks - 1
7714 joffa = joffa + nb
7715 GO TO 30
7716 END IF
7717
7718 tmp1 =
min( joffa, jjmax ) - jja + 1
7719 IF( lower .AND. tmp1.GT.0 ) THEN
7721 $ a( iia+(jja-1)*lda ), lda )
7722 jja = jja + tmp1
7723 n1 = n1 - tmp1
7724 END IF
7725
7726 IF( nblks.LE.0 )
7727 $ RETURN
7728
7729 lcmt = lcmt00
7730 nblkd = nblks
7731 joffd = joffa
7732
7733 nbloc = nb
7734 40 CONTINUE
7735 IF( nblkd.GT.0 .AND. lcmt.LE.iupp ) THEN
7736 IF( nblkd.EQ.1 )
7737 $ nbloc = lnbloc
7738 CALL pb_slascal( uplo, imbloc, nbloc, lcmt, alpha,
7739 $ a( iia+joffd*lda ), lda )
7740 lcmt00 = lcmt
7741 lcmt = lcmt + qnb
7742 nblks = nblkd
7743 nblkd = nblkd - 1
7744 joffa = joffd
7745 joffd = joffd + nbloc
7746 GO TO 40
7747 END IF
7748
7749 tmp1 = n1 - joffd + jja - 1
7750 IF( upper .AND. tmp1.GT.0 )
7751 $
CALL pb_slascal(
'All', imbloc, tmp1, 0, alpha,
7752 $ a( iia+joffd*lda ), lda )
7753
7754 tmp1 = joffa - jja + 1
7755 m1 = m1 - imbloc
7756 n1 = n1 - tmp1
7757 lcmt00 = lcmt00 - ( iupp - upp + pmb )
7758 mblks = mblks - 1
7759 ioffa = ioffa + imbloc
7760
7761 IF( lower .AND. m1.GT.0 .AND. tmp1.GT.0 )
7762 $
CALL pb_slascal(
'All', m1, tmp1, 0, alpha,
7763 $ a( ioffa+1+(jja-1)*lda ), lda )
7764
7765 iia = ioffa + 1
7766 jja = joffa + 1
7767
7768 END IF
7769
7770 nbloc = nb
7771 50 CONTINUE
7772 IF( nblks.GT.0 ) THEN
7773 IF( nblks.EQ.1 )
7774 $ nbloc = lnbloc
7775 60 CONTINUE
7776 IF( mblks.GT.0 .AND. lcmt00.GT.upp ) THEN
7777 lcmt00 = lcmt00 - pmb
7778 mblks = mblks - 1
7779 ioffa = ioffa + mb
7780 GO TO 60
7781 END IF
7782
7783 tmp1 =
min( ioffa, iimax ) - iia + 1
7784 IF( upper .AND. tmp1.GT.0 ) THEN
7786 $ a( iia+joffa*lda ), lda )
7787 iia = iia + tmp1
7788 m1 = m1 - tmp1
7789 END IF
7790
7791 IF( mblks.LE.0 )
7792 $ RETURN
7793
7794 lcmt = lcmt00
7795 mblkd = mblks
7796 ioffd = ioffa
7797
7798 mbloc = mb
7799 70 CONTINUE
7800 IF( mblkd.GT.0 .AND. lcmt.GE.low ) THEN
7801 IF( mblkd.EQ.1 )
7802 $ mbloc = lmbloc
7803 CALL pb_slascal( uplo, mbloc, nbloc, lcmt, alpha,
7804 $ a( ioffd+1+joffa*lda ), lda )
7805 lcmt00 = lcmt
7806 lcmt = lcmt - pmb
7807 mblks = mblkd
7808 mblkd = mblkd - 1
7809 ioffa = ioffd
7810 ioffd = ioffd + mbloc
7811 GO TO 70
7812 END IF
7813
7814 tmp1 = m1 - ioffd + iia - 1
7815 IF( lower .AND. tmp1.GT.0 )
7816 $
CALL pb_slascal(
'All', tmp1, nbloc, 0, alpha,
7817 $ a( ioffd+1+joffa*lda ), lda )
7818
7819 tmp1 =
min( ioffa, iimax ) - iia + 1
7820 m1 = m1 - tmp1
7821 n1 = n1 - nbloc
7822 lcmt00 = lcmt00 + qnb
7823 nblks = nblks - 1
7824 joffa = joffa + nbloc
7825
7826 IF( upper .AND. tmp1.GT.0 .AND. n1.GT.0 )
7827 $
CALL pb_slascal(
'All', tmp1, n1, 0, alpha,
7828 $ a( iia+joffa*lda ), lda )
7829
7830 iia = ioffa + 1
7831 jja = joffa + 1
7832
7833 GO TO 50
7834
7835 END IF
7836
7837 END IF
7838
7839 RETURN
7840
7841
7842
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_infog2l(i, j, desc, nprow, npcol, myrow, mycol, ii, jj, prow, pcol)
subroutine pb_desctrans(descin, descout)
integer function pb_numroc(n, i, inb, nb, proc, srcproc, nprocs)
subroutine pb_slascal(uplo, m, n, ioffd, alpha, a, lda)