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