7044
7045
7046
7047
7048
7049
7050
7051 CHARACTER*1 TOGGLE
7052 INTEGER IA, JA, N
7053
7054
7055 INTEGER DESCA( * )
7056 COMPLEX A( * )
7057
7058
7059
7060
7061
7062
7063
7064
7065
7066
7067
7068
7069
7070
7071
7072
7073
7074
7075
7076
7077
7078
7079
7080
7081
7082
7083
7084
7085
7086
7087
7088
7089
7090
7091
7092
7093
7094
7095
7096
7097
7098
7099
7100
7101
7102
7103
7104
7105
7106
7107
7108
7109
7110
7111
7112
7113
7114
7115
7116
7117
7118
7119
7120
7121
7122
7123
7124
7125
7126
7127
7128
7129
7130
7131
7132
7133
7134
7135
7136
7137
7138
7139
7140
7141
7142
7143
7144
7145
7146
7147
7148
7149
7150
7151
7152
7153
7154
7155
7156
7157
7158
7159
7160
7161
7162
7163
7164
7165
7166
7167
7168
7169
7170
7171 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
7172 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
7173 $ RSRC_
7174 parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
7175 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
7176 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
7177 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
7178 REAL ZERO
7179 parameter( zero = 0.0e+0 )
7180
7181
7182 LOGICAL COLREP, GODOWN, GOLEFT, ROWREP
7183 INTEGER I, IACOL, IAROW, ICTXT, IIA, IJOFFA, ILOW,
7184 $ IMB1, IMBLOC, INB1, INBLOC, IOFFA, IOFFD, IUPP,
7185 $ JJA, JOFFA, JOFFD, LCMT, LCMT00, LDA, LDAP1,
7186 $ LMBLOC, LNBLOC, LOW, MB, MBLKD, MBLKS, MBLOC,
7187 $ MRCOL, MRROW, MYCOL, MYROW, NB, NBLKD, NBLKS,
7188 $ NBLOC, NP, NPCOL, NPROW, NQ, PMB, QNB, UPP
7189 REAL ALPHA, ATMP
7190
7191
7192 INTEGER DESCA2( DLEN_ )
7193
7194
7197
7198
7199 LOGICAL LSAME
7200 REAL PSLAMCH
7202
7203
7205
7206
7207
7208
7209
7211
7212
7213
7214 ictxt = desca2( ctxt_ )
7215 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
7216
7217 IF( n.LE.0 )
7218 $ RETURN
7219
7220 IF(
lsame( toggle,
'Z' ) )
THEN
7221 alpha = zero
7222 ELSE IF(
lsame( toggle,
'B' ) )
THEN
7223 alpha =
pslamch( ictxt,
'Epsilon' )
7224 alpha = alpha /
pslamch( ictxt,
'Safe minimum' )
7225 END IF
7226
7227 CALL pb_ainfog2l( n, n, ia, ja, desca2, nprow, npcol, myrow,
7228 $ mycol, imb1, inb1, np, nq, iia, jja, iarow,
7229 $ iacol, mrrow, mrcol )
7230
7231 IF( np.LE.0 .OR. nq.LE.0 )
7232 $ RETURN
7233
7234
7235
7236
7237 mb = desca2( mb_ )
7238 nb = desca2( nb_ )
7239 CALL pb_binfo( 0, np, nq, imb1, inb1, mb, nb, mrrow, mrcol,
7240 $ lcmt00, mblks, nblks, imbloc, inbloc, lmbloc,
7241 $ lnbloc, ilow, low, iupp, upp )
7242
7243 ioffa = iia - 1
7244 joffa = jja - 1
7245 rowrep = ( desca2( rsrc_ ).EQ.-1 )
7246 colrep = ( desca2( csrc_ ).EQ.-1 )
7247 lda = desca2( lld_ )
7248 ldap1 = lda + 1
7249
7250 IF( rowrep ) THEN
7251 pmb = mb
7252 ELSE
7253 pmb = nprow * mb
7254 END IF
7255 IF( colrep ) THEN
7256 qnb = nb
7257 ELSE
7258 qnb = npcol * nb
7259 END IF
7260
7261
7262
7263
7264 godown = ( lcmt00.GT.iupp )
7265 goleft = ( lcmt00.LT.ilow )
7266
7267 IF( .NOT.godown .AND. .NOT.goleft ) THEN
7268
7269
7270
7271 IF( lcmt00.GE.0 ) THEN
7272 ijoffa = ioffa + lcmt00 + ( joffa - 1 ) * lda
7273 DO 10 i = 1,
min( inbloc,
max( 0, imbloc - lcmt00 ) )
7274 atmp = real( a( ijoffa + i*ldap1 ) )
7275 a( ijoffa + i*ldap1 ) =
cmplx( atmp, alpha )
7276 10 CONTINUE
7277 ELSE
7278 ijoffa = ioffa + ( joffa - lcmt00 - 1 ) * lda
7279 DO 20 i = 1,
min( imbloc,
max( 0, inbloc + lcmt00 ) )
7280 atmp = real( a( ijoffa + i*ldap1 ) )
7281 a( ijoffa + i*ldap1 ) =
cmplx( atmp, alpha )
7282 20 CONTINUE
7283 END IF
7284 goleft = ( ( lcmt00 - ( iupp - upp + pmb ) ).LT.ilow )
7285 godown = .NOT.goleft
7286
7287 END IF
7288
7289 IF( godown ) THEN
7290
7291 lcmt00 = lcmt00 - ( iupp - upp + pmb )
7292 mblks = mblks - 1
7293 ioffa = ioffa + imbloc
7294
7295 30 CONTINUE
7296 IF( mblks.GT.0 .AND. lcmt00.GT.upp ) THEN
7297 lcmt00 = lcmt00 - pmb
7298 mblks = mblks - 1
7299 ioffa = ioffa + mb
7300 GO TO 30
7301 END IF
7302
7303 IF( mblks.LE.0 )
7304 $ RETURN
7305
7306 lcmt = lcmt00
7307 mblkd = mblks
7308 ioffd = ioffa
7309
7310 mbloc = mb
7311 40 CONTINUE
7312 IF( mblkd.GT.0 .AND. lcmt.GE.ilow ) THEN
7313 IF( mblkd.EQ.1 )
7314 $ mbloc = lmbloc
7315 IF( lcmt.GE.0 ) THEN
7316 ijoffa = ioffd + lcmt + ( joffa - 1 ) * lda
7317 DO 50 i = 1,
min( inbloc,
max( 0, mbloc - lcmt ) )
7318 atmp = real( a( ijoffa + i*ldap1 ) )
7319 a( ijoffa + i*ldap1 ) =
cmplx( atmp, alpha )
7320 50 CONTINUE
7321 ELSE
7322 ijoffa = ioffd + ( joffa - lcmt - 1 ) * lda
7323 DO 60 i = 1,
min( mbloc,
max( 0, inbloc + lcmt ) )
7324 atmp = real( a( ijoffa + i*ldap1 ) )
7325 a( ijoffa + i*ldap1 ) =
cmplx( atmp, alpha )
7326 60 CONTINUE
7327 END IF
7328 lcmt00 = lcmt
7329 lcmt = lcmt - pmb
7330 mblks = mblkd
7331 mblkd = mblkd - 1
7332 ioffa = ioffd
7333 ioffd = ioffd + mbloc
7334 GO TO 40
7335 END IF
7336
7337 lcmt00 = lcmt00 + low - ilow + qnb
7338 nblks = nblks - 1
7339 joffa = joffa + inbloc
7340
7341 ELSE IF( goleft ) THEN
7342
7343 lcmt00 = lcmt00 + low - ilow + qnb
7344 nblks = nblks - 1
7345 joffa = joffa + inbloc
7346
7347 70 CONTINUE
7348 IF( nblks.GT.0 .AND. lcmt00.LT.low ) THEN
7349 lcmt00 = lcmt00 + qnb
7350 nblks = nblks - 1
7351 joffa = joffa + nb
7352 GO TO 70
7353 END IF
7354
7355 IF( nblks.LE.0 )
7356 $ RETURN
7357
7358 lcmt = lcmt00
7359 nblkd = nblks
7360 joffd = joffa
7361
7362 nbloc = nb
7363 80 CONTINUE
7364 IF( nblkd.GT.0 .AND. lcmt.LE.iupp ) THEN
7365 IF( nblkd.EQ.1 )
7366 $ nbloc = lnbloc
7367 IF( lcmt.GE.0 ) THEN
7368 ijoffa = ioffa + lcmt + ( joffd - 1 ) * lda
7369 DO 90 i = 1,
min( nbloc,
max( 0, imbloc - lcmt ) )
7370 atmp = real( a( ijoffa + i*ldap1 ) )
7371 a( ijoffa + i*ldap1 ) =
cmplx( atmp, alpha )
7372 90 CONTINUE
7373 ELSE
7374 ijoffa = ioffa + ( joffd - lcmt - 1 ) * lda
7375 DO 100 i = 1,
min( imbloc,
max( 0, nbloc + lcmt ) )
7376 atmp = real( a( ijoffa + i*ldap1 ) )
7377 a( ijoffa + i*ldap1 ) =
cmplx( atmp, alpha )
7378 100 CONTINUE
7379 END IF
7380 lcmt00 = lcmt
7381 lcmt = lcmt + qnb
7382 nblks = nblkd
7383 nblkd = nblkd - 1
7384 joffa = joffd
7385 joffd = joffd + nbloc
7386 GO TO 80
7387 END IF
7388
7389 lcmt00 = lcmt00 - ( iupp - upp + pmb )
7390 mblks = mblks - 1
7391 ioffa = ioffa + imbloc
7392
7393 END IF
7394
7395 nbloc = nb
7396 110 CONTINUE
7397 IF( nblks.GT.0 ) THEN
7398 IF( nblks.EQ.1 )
7399 $ nbloc = lnbloc
7400 120 CONTINUE
7401 IF( mblks.GT.0 .AND. lcmt00.GT.upp ) THEN
7402 lcmt00 = lcmt00 - pmb
7403 mblks = mblks - 1
7404 ioffa = ioffa + mb
7405 GO TO 120
7406 END IF
7407
7408 IF( mblks.LE.0 )
7409 $ RETURN
7410
7411 lcmt = lcmt00
7412 mblkd = mblks
7413 ioffd = ioffa
7414
7415 mbloc = mb
7416 130 CONTINUE
7417 IF( mblkd.GT.0 .AND. lcmt.GE.low ) THEN
7418 IF( mblkd.EQ.1 )
7419 $ mbloc = lmbloc
7420 IF( lcmt.GE.0 ) THEN
7421 ijoffa = ioffd + lcmt + ( joffa - 1 ) * lda
7422 DO 140 i = 1,
min( nbloc,
max( 0, mbloc - lcmt ) )
7423 atmp = real( a( ijoffa + i*ldap1 ) )
7424 a( ijoffa + i*ldap1 ) =
cmplx( atmp, alpha )
7425 140 CONTINUE
7426 ELSE
7427 ijoffa = ioffd + ( joffa - lcmt - 1 ) * lda
7428 DO 150 i = 1,
min( mbloc,
max( 0, nbloc + lcmt ) )
7429 atmp = real( a( ijoffa + i*ldap1 ) )
7430 a( ijoffa + i*ldap1 ) =
cmplx( atmp, alpha )
7431 150 CONTINUE
7432 END IF
7433 lcmt00 = lcmt
7434 lcmt = lcmt - pmb
7435 mblks = mblkd
7436 mblkd = mblkd - 1
7437 ioffa = ioffd
7438 ioffd = ioffd + mbloc
7439 GO TO 130
7440 END IF
7441
7442 lcmt00 = lcmt00 + qnb
7443 nblks = nblks - 1
7444 joffa = joffa + nbloc
7445 GO TO 110
7446
7447 END IF
7448
7449 RETURN
7450
7451
7452
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)
real function pslamch(ictxt, cmach)