7984
7985
7986
7987
7988
7989
7990
7991 CHARACTER*1 TYPE
7992 INTEGER IA, JA, M, N
7993 COMPLEX*16 ALPHA
7994
7995
7996 INTEGER DESCA( * )
7997 COMPLEX*16 A( * )
7998
7999
8000
8001
8002
8003
8004
8005
8006
8007
8008
8009
8010
8011
8012
8013
8014
8015
8016
8017
8018
8019
8020
8021
8022
8023
8024
8025
8026
8027
8028
8029
8030
8031
8032
8033
8034
8035
8036
8037
8038
8039
8040
8041
8042
8043
8044
8045
8046
8047
8048
8049
8050
8051
8052
8053
8054
8055
8056
8057
8058
8059
8060
8061
8062
8063
8064
8065
8066
8067
8068
8069
8070
8071
8072
8073
8074
8075
8076
8077
8078
8079
8080
8081
8082
8083
8084
8085
8086
8087
8088
8089
8090
8091
8092
8093
8094
8095
8096
8097
8098
8099
8100
8101
8102
8103
8104
8105
8106
8107
8108
8109
8110
8111
8112
8113
8114
8115
8116
8117
8118 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
8119 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
8120 $ RSRC_
8121 parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
8122 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
8123 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
8124 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
8125
8126
8127 CHARACTER*1 UPLO
8128 LOGICAL GODOWN, GOLEFT, LOWER, UPPER
8129 INTEGER IACOL, IAROW, ICTXT, IIA, IIMAX, ILOW, IMB1,
8130 $ IMBLOC, INB1, INBLOC, IOFFA, IOFFD, ITYPE,
8131 $ IUPP, JJA, JJMAX, JOFFA, JOFFD, LCMT, LCMT00,
8132 $ LDA, LMBLOC, LNBLOC, LOW, M1, MB, MBLKD, MBLKS,
8133 $ MBLOC, MP, MRCOL, MRROW, MYCOL, MYROW, N1, NB,
8134 $ NBLKD, NBLKS, NBLOC, NPCOL, NPROW, NQ, PMB,
8135 $ QNB, TMP1, UPP
8136
8137
8138 INTEGER DESCA2( DLEN_ )
8139
8140
8143
8144
8145 LOGICAL LSAME
8146 INTEGER PB_NUMROC
8148
8149
8151
8152
8153
8154
8155
8157
8158
8159
8160 ictxt = desca2( ctxt_ )
8161 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
8162
8163
8164
8165 IF( m.EQ.0 .OR. n.EQ.0 )
8166 $ RETURN
8167
8168 IF(
lsame(
TYPE,
'L' ) ) THEN
8169 itype = 1
8170 uplo = TYPE
8171 upper = .false.
8172 lower = .true.
8173 ioffd = 0
8174 ELSE IF(
lsame(
TYPE,
'U' ) ) THEN
8175 itype = 2
8176 uplo = TYPE
8177 upper = .true.
8178 lower = .false.
8179 ioffd = 0
8180 ELSE IF(
lsame(
TYPE,
'H' ) ) THEN
8181 itype = 3
8182 uplo = 'U'
8183 upper = .true.
8184 lower = .false.
8185 ioffd = 1
8186 ELSE
8187 itype = 0
8188 uplo = 'A'
8189 upper = .true.
8190 lower = .true.
8191 ioffd = 0
8192 END IF
8193
8194
8195
8196 IF( itype.EQ.0 ) THEN
8197
8198
8199
8200 CALL pb_infog2l( ia, ja, desca2, nprow, npcol, myrow, mycol,
8201 $ iia, jja, iarow, iacol )
8202 mp =
pb_numroc( m, ia, desca2( imb_ ), desca2( mb_ ), myrow,
8203 $ desca2( rsrc_ ), nprow )
8204 nq =
pb_numroc( n, ja, desca2( inb_ ), desca2( nb_ ), mycol,
8205 $ desca2( csrc_ ), npcol )
8206
8207 IF( mp.LE.0 .OR. nq.LE.0 )
8208 $ RETURN
8209
8210 lda = desca2( lld_ )
8211 ioffa = iia + ( jja - 1 ) * lda
8212
8213 CALL pb_zlascal(
'All', mp, nq, 0, alpha, a( ioffa ), lda )
8214
8215 ELSE
8216
8217
8218
8219 CALL pb_ainfog2l( m, n, ia, ja, desca2, nprow, npcol, myrow,
8220 $ mycol, imb1, inb1, mp, nq, iia, jja, iarow,
8221 $ iacol, mrrow, mrcol )
8222
8223 IF( mp.LE.0 .OR. nq.LE.0 )
8224 $ RETURN
8225
8226
8227
8228
8229 mb = desca2( mb_ )
8230 nb = desca2( nb_ )
8231 lda = desca2( lld_ )
8232
8233 CALL pb_binfo( ioffd, mp, nq, imb1, inb1, mb, nb, mrrow,
8234 $ mrcol, lcmt00, mblks, nblks, imbloc, inbloc,
8235 $ lmbloc, lnbloc, ilow, low, iupp, upp )
8236
8237 m1 = mp
8238 n1 = nq
8239 ioffa = iia - 1
8240 joffa = jja - 1
8241 iimax = ioffa + mp
8242 jjmax = joffa + nq
8243
8244 IF( desca2( rsrc_ ).LT.0 ) THEN
8245 pmb = mb
8246 ELSE
8247 pmb = nprow * mb
8248 END IF
8249 IF( desca2( csrc_ ).LT.0 ) THEN
8250 qnb = nb
8251 ELSE
8252 qnb = npcol * nb
8253 END IF
8254
8255
8256
8257
8258 godown = ( lcmt00.GT.iupp )
8259 goleft = ( lcmt00.LT.ilow )
8260
8261 IF( .NOT.godown .AND. .NOT.goleft ) THEN
8262
8263
8264
8265 goleft = ( ( lcmt00 - ( iupp - upp + pmb ) ).LT.ilow )
8266 godown = .NOT.goleft
8267
8268 CALL pb_zlascal( uplo, imbloc, inbloc, lcmt00, alpha,
8269 $ a( iia+joffa*lda ), lda )
8270 IF( godown ) THEN
8271 IF( upper .AND. nq.GT.inbloc )
8272 $
CALL pb_zlascal(
'All', imbloc, nq-inbloc, 0, alpha,
8273 $ a( iia+(joffa+inbloc)*lda ), lda )
8274 iia = iia + imbloc
8275 m1 = m1 - imbloc
8276 ELSE
8277 IF( lower .AND. mp.GT.imbloc )
8278 $
CALL pb_zlascal(
'All', mp-imbloc, inbloc, 0, alpha,
8279 $ a( iia+imbloc+joffa*lda ), lda )
8280 jja = jja + inbloc
8281 n1 = n1 - inbloc
8282 END IF
8283
8284 END IF
8285
8286 IF( godown ) THEN
8287
8288 lcmt00 = lcmt00 - ( iupp - upp + pmb )
8289 mblks = mblks - 1
8290 ioffa = ioffa + imbloc
8291
8292 10 CONTINUE
8293 IF( mblks.GT.0 .AND. lcmt00.GT.upp ) THEN
8294 lcmt00 = lcmt00 - pmb
8295 mblks = mblks - 1
8296 ioffa = ioffa + mb
8297 GO TO 10
8298 END IF
8299
8300 tmp1 =
min( ioffa, iimax ) - iia + 1
8301 IF( upper .AND. tmp1.GT.0 ) THEN
8303 $ a( iia+joffa*lda ), lda )
8304 iia = iia + tmp1
8305 m1 = m1 - tmp1
8306 END IF
8307
8308 IF( mblks.LE.0 )
8309 $ RETURN
8310
8311 lcmt = lcmt00
8312 mblkd = mblks
8313 ioffd = ioffa
8314
8315 mbloc = mb
8316 20 CONTINUE
8317 IF( mblkd.GT.0 .AND. lcmt.GE.ilow ) THEN
8318 IF( mblkd.EQ.1 )
8319 $ mbloc = lmbloc
8320 CALL pb_zlascal( uplo, mbloc, inbloc, lcmt, alpha,
8321 $ a( ioffd+1+joffa*lda ), lda )
8322 lcmt00 = lcmt
8323 lcmt = lcmt - pmb
8324 mblks = mblkd
8325 mblkd = mblkd - 1
8326 ioffa = ioffd
8327 ioffd = ioffd + mbloc
8328 GO TO 20
8329 END IF
8330
8331 tmp1 = m1 - ioffd + iia - 1
8332 IF( lower .AND. tmp1.GT.0 )
8333 $
CALL pb_zlascal(
'All', tmp1, inbloc, 0, alpha,
8334 $ a( ioffd+1+joffa*lda ), lda )
8335
8336 tmp1 = ioffa - iia + 1
8337 m1 = m1 - tmp1
8338 n1 = n1 - inbloc
8339 lcmt00 = lcmt00 + low - ilow + qnb
8340 nblks = nblks - 1
8341 joffa = joffa + inbloc
8342
8343 IF( upper .AND. tmp1.GT.0 .AND. n1.GT.0 )
8344 $
CALL pb_zlascal(
'All', tmp1, n1, 0, alpha,
8345 $ a( iia+joffa*lda ), lda )
8346
8347 iia = ioffa + 1
8348 jja = joffa + 1
8349
8350 ELSE IF( goleft ) THEN
8351
8352 lcmt00 = lcmt00 + low - ilow + qnb
8353 nblks = nblks - 1
8354 joffa = joffa + inbloc
8355
8356 30 CONTINUE
8357 IF( nblks.GT.0 .AND. lcmt00.LT.low ) THEN
8358 lcmt00 = lcmt00 + qnb
8359 nblks = nblks - 1
8360 joffa = joffa + nb
8361 GO TO 30
8362 END IF
8363
8364 tmp1 =
min( joffa, jjmax ) - jja + 1
8365 IF( lower .AND. tmp1.GT.0 ) THEN
8367 $ a( iia+(jja-1)*lda ), lda )
8368 jja = jja + tmp1
8369 n1 = n1 - tmp1
8370 END IF
8371
8372 IF( nblks.LE.0 )
8373 $ RETURN
8374
8375 lcmt = lcmt00
8376 nblkd = nblks
8377 joffd = joffa
8378
8379 nbloc = nb
8380 40 CONTINUE
8381 IF( nblkd.GT.0 .AND. lcmt.LE.iupp ) THEN
8382 IF( nblkd.EQ.1 )
8383 $ nbloc = lnbloc
8384 CALL pb_zlascal( uplo, imbloc, nbloc, lcmt, alpha,
8385 $ a( iia+joffd*lda ), lda )
8386 lcmt00 = lcmt
8387 lcmt = lcmt + qnb
8388 nblks = nblkd
8389 nblkd = nblkd - 1
8390 joffa = joffd
8391 joffd = joffd + nbloc
8392 GO TO 40
8393 END IF
8394
8395 tmp1 = n1 - joffd + jja - 1
8396 IF( upper .AND. tmp1.GT.0 )
8397 $
CALL pb_zlascal(
'All', imbloc, tmp1, 0, alpha,
8398 $ a( iia+joffd*lda ), lda )
8399
8400 tmp1 = joffa - jja + 1
8401 m1 = m1 - imbloc
8402 n1 = n1 - tmp1
8403 lcmt00 = lcmt00 - ( iupp - upp + pmb )
8404 mblks = mblks - 1
8405 ioffa = ioffa + imbloc
8406
8407 IF( lower .AND. m1.GT.0 .AND. tmp1.GT.0 )
8408 $
CALL pb_zlascal(
'All', m1, tmp1, 0, alpha,
8409 $ a( ioffa+1+(jja-1)*lda ), lda )
8410
8411 iia = ioffa + 1
8412 jja = joffa + 1
8413
8414 END IF
8415
8416 nbloc = nb
8417 50 CONTINUE
8418 IF( nblks.GT.0 ) THEN
8419 IF( nblks.EQ.1 )
8420 $ nbloc = lnbloc
8421 60 CONTINUE
8422 IF( mblks.GT.0 .AND. lcmt00.GT.upp ) THEN
8423 lcmt00 = lcmt00 - pmb
8424 mblks = mblks - 1
8425 ioffa = ioffa + mb
8426 GO TO 60
8427 END IF
8428
8429 tmp1 =
min( ioffa, iimax ) - iia + 1
8430 IF( upper .AND. tmp1.GT.0 ) THEN
8432 $ a( iia+joffa*lda ), lda )
8433 iia = iia + tmp1
8434 m1 = m1 - tmp1
8435 END IF
8436
8437 IF( mblks.LE.0 )
8438 $ RETURN
8439
8440 lcmt = lcmt00
8441 mblkd = mblks
8442 ioffd = ioffa
8443
8444 mbloc = mb
8445 70 CONTINUE
8446 IF( mblkd.GT.0 .AND. lcmt.GE.low ) THEN
8447 IF( mblkd.EQ.1 )
8448 $ mbloc = lmbloc
8449 CALL pb_zlascal( uplo, mbloc, nbloc, lcmt, alpha,
8450 $ a( ioffd+1+joffa*lda ), lda )
8451 lcmt00 = lcmt
8452 lcmt = lcmt - pmb
8453 mblks = mblkd
8454 mblkd = mblkd - 1
8455 ioffa = ioffd
8456 ioffd = ioffd + mbloc
8457 GO TO 70
8458 END IF
8459
8460 tmp1 = m1 - ioffd + iia - 1
8461 IF( lower .AND. tmp1.GT.0 )
8462 $
CALL pb_zlascal(
'All', tmp1, nbloc, 0, alpha,
8463 $ a( ioffd+1+joffa*lda ), lda )
8464
8465 tmp1 =
min( ioffa, iimax ) - iia + 1
8466 m1 = m1 - tmp1
8467 n1 = n1 - nbloc
8468 lcmt00 = lcmt00 + qnb
8469 nblks = nblks - 1
8470 joffa = joffa + nbloc
8471
8472 IF( upper .AND. tmp1.GT.0 .AND. n1.GT.0 )
8473 $
CALL pb_zlascal(
'All', tmp1, n1, 0, alpha,
8474 $ a( iia+joffa*lda ), lda )
8475
8476 iia = ioffa + 1
8477 jja = joffa + 1
8478
8479 GO TO 50
8480
8481 END IF
8482
8483 END IF
8484
8485 RETURN
8486
8487
8488
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_zlascal(uplo, m, n, ioffd, alpha, a, lda)