8894
8895
8896
8897
8898
8899
8900
8901 LOGICAL INPLACE
8902 INTEGER IA, JA, N
8903 COMPLEX ALPHA
8904
8905
8906 INTEGER DESCA( * )
8907 COMPLEX A( * )
8908
8909
8910
8911
8912
8913
8914
8915
8916
8917
8918
8919
8920
8921
8922
8923
8924
8925
8926
8927
8928
8929
8930
8931
8932
8933
8934
8935
8936
8937
8938
8939
8940
8941
8942
8943
8944
8945
8946
8947
8948
8949
8950
8951
8952
8953
8954
8955
8956
8957
8958
8959
8960
8961
8962
8963
8964
8965
8966
8967
8968
8969
8970
8971
8972
8973
8974
8975
8976
8977
8978
8979
8980
8981
8982
8983
8984
8985
8986
8987
8988
8989
8990
8991
8992
8993
8994
8995
8996
8997
8998
8999
9000
9001
9002
9003
9004
9005
9006
9007
9008
9009
9010
9011
9012
9013
9014
9015
9016
9017
9018
9019
9020
9021 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
9022 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
9023 $ RSRC_
9024 parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
9025 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
9026 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
9027 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
9028
9029
9030 LOGICAL GODOWN, GOLEFT
9031 INTEGER I, IACOL, IAROW, ICTXT, IIA, IJOFFA, ILOW,
9032 $ IMB1, IMBLOC, INB1, INBLOC, IOFFA, IOFFD, IUPP,
9033 $ JJA, JOFFA, JOFFD, LCMT, LCMT00, LDA, LDAP1,
9034 $ LMBLOC, LNBLOC, LOW, MB, MBLKD, MBLKS, MBLOC,
9035 $ MRCOL, MRROW, MYCOL, MYROW, NB, NBLKD, NBLKS,
9036 $ NBLOC, NP, NPCOL, NPROW, NQ, PMB, QNB, UPP
9037 COMPLEX ATMP
9038
9039
9040 INTEGER DESCA2( DLEN_ )
9041
9042
9045
9046
9048
9049
9050
9051
9052
9054
9055
9056
9057 ictxt = desca2( ctxt_ )
9058 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
9059
9060 IF( n.EQ.0 )
9061 $ RETURN
9062
9063 CALL pb_ainfog2l( n, n, ia, ja, desca2, nprow, npcol, myrow,
9064 $ mycol, imb1, inb1, np, nq, iia, jja, iarow,
9065 $ iacol, mrrow, mrcol )
9066
9067
9068
9069 IF( inplace ) THEN
9070 iia = 1
9071 jja = 1
9072 END IF
9073
9074
9075
9076
9077 mb = desca2( mb_ )
9078 nb = desca2( nb_ )
9079
9080 CALL pb_binfo( 0, np, nq, imb1, inb1, mb, nb, mrrow, mrcol,
9081 $ lcmt00, mblks, nblks, imbloc, inbloc, lmbloc,
9082 $ lnbloc, ilow, low, iupp, upp )
9083
9084 ioffa = iia - 1
9085 joffa = jja - 1
9086 lda = desca2( lld_ )
9087 ldap1 = lda + 1
9088
9089 IF( desca2( rsrc_ ).LT.0 ) THEN
9090 pmb = mb
9091 ELSE
9092 pmb = nprow * mb
9093 END IF
9094 IF( desca2( csrc_ ).LT.0 ) THEN
9095 qnb = nb
9096 ELSE
9097 qnb = npcol * nb
9098 END IF
9099
9100
9101
9102
9103 godown = ( lcmt00.GT.iupp )
9104 goleft = ( lcmt00.LT.ilow )
9105
9106 IF( .NOT.godown .AND. .NOT.goleft ) THEN
9107
9108
9109
9110 IF( lcmt00.GE.0 ) THEN
9111 ijoffa = ioffa+lcmt00 + ( joffa - 1 ) * lda
9112 DO 10 i = 1,
min( inbloc,
max( 0, imbloc - lcmt00 ) )
9113 atmp = a( ijoffa + i*ldap1 )
9114 a( ijoffa + i*ldap1 ) = alpha +
9115 $
cmplx( abs( real( atmp ) ),
9116 $ abs( aimag( atmp ) ) )
9117 10 CONTINUE
9118 ELSE
9119 ijoffa = ioffa + ( joffa - lcmt00 - 1 ) * lda
9120 DO 20 i = 1,
min( imbloc,
max( 0, inbloc + lcmt00 ) )
9121 atmp = a( ijoffa + i*ldap1 )
9122 a( ijoffa + i*ldap1 ) = alpha +
9123 $
cmplx( abs( real( atmp ) ),
9124 $ abs( aimag( atmp ) ) )
9125 20 CONTINUE
9126 END IF
9127 goleft = ( ( lcmt00 - ( iupp - upp + pmb ) ).LT.ilow )
9128 godown = .NOT.goleft
9129
9130 END IF
9131
9132 IF( godown ) THEN
9133
9134 lcmt00 = lcmt00 - ( iupp - upp + pmb )
9135 mblks = mblks - 1
9136 ioffa = ioffa + imbloc
9137
9138 30 CONTINUE
9139 IF( mblks.GT.0 .AND. lcmt00.GT.upp ) THEN
9140 lcmt00 = lcmt00 - pmb
9141 mblks = mblks - 1
9142 ioffa = ioffa + mb
9143 GO TO 30
9144 END IF
9145
9146 lcmt = lcmt00
9147 mblkd = mblks
9148 ioffd = ioffa
9149
9150 mbloc = mb
9151 40 CONTINUE
9152 IF( mblkd.GT.0 .AND. lcmt.GE.ilow ) THEN
9153 IF( mblkd.EQ.1 )
9154 $ mbloc = lmbloc
9155 IF( lcmt.GE.0 ) THEN
9156 ijoffa = ioffd + lcmt + ( joffa - 1 ) * lda
9157 DO 50 i = 1,
min( inbloc,
max( 0, mbloc - lcmt ) )
9158 atmp = a( ijoffa + i*ldap1 )
9159 a( ijoffa + i*ldap1 ) = alpha +
9160 $
cmplx( abs( real( atmp ) ),
9161 $ abs( aimag( atmp ) ) )
9162 50 CONTINUE
9163 ELSE
9164 ijoffa = ioffd + ( joffa - lcmt - 1 ) * lda
9165 DO 60 i = 1,
min( mbloc,
max( 0, inbloc + lcmt ) )
9166 atmp = a( ijoffa + i*ldap1 )
9167 a( ijoffa + i*ldap1 ) = alpha +
9168 $
cmplx( abs( real( atmp ) ),
9169 $ abs( aimag( atmp ) ) )
9170 60 CONTINUE
9171 END IF
9172 lcmt00 = lcmt
9173 lcmt = lcmt - pmb
9174 mblks = mblkd
9175 mblkd = mblkd - 1
9176 ioffa = ioffd
9177 ioffd = ioffd + mbloc
9178 GO TO 40
9179 END IF
9180
9181 lcmt00 = lcmt00 + low - ilow + qnb
9182 nblks = nblks - 1
9183 joffa = joffa + inbloc
9184
9185 ELSE IF( goleft ) THEN
9186
9187 lcmt00 = lcmt00 + low - ilow + qnb
9188 nblks = nblks - 1
9189 joffa = joffa + inbloc
9190
9191 70 CONTINUE
9192 IF( nblks.GT.0 .AND. lcmt00.LT.low ) THEN
9193 lcmt00 = lcmt00 + qnb
9194 nblks = nblks - 1
9195 joffa = joffa + nb
9196 GO TO 70
9197 END IF
9198
9199 lcmt = lcmt00
9200 nblkd = nblks
9201 joffd = joffa
9202
9203 nbloc = nb
9204 80 CONTINUE
9205 IF( nblkd.GT.0 .AND. lcmt.LE.iupp ) THEN
9206 IF( nblkd.EQ.1 )
9207 $ nbloc = lnbloc
9208 IF( lcmt.GE.0 ) THEN
9209 ijoffa = ioffa + lcmt + ( joffd - 1 ) * lda
9210 DO 90 i = 1,
min( nbloc,
max( 0, imbloc - lcmt ) )
9211 atmp = a( ijoffa + i*ldap1 )
9212 a( ijoffa + i*ldap1 ) = alpha +
9213 $
cmplx( abs( real( atmp ) ),
9214 $ abs( aimag( atmp ) ) )
9215 90 CONTINUE
9216 ELSE
9217 ijoffa = ioffa + ( joffd - lcmt - 1 ) * lda
9218 DO 100 i = 1,
min( imbloc,
max( 0, nbloc + lcmt ) )
9219 atmp = a( ijoffa + i*ldap1 )
9220 a( ijoffa + i*ldap1 ) = alpha +
9221 $
cmplx( abs( real( atmp ) ),
9222 $ abs( aimag( atmp ) ) )
9223 100 CONTINUE
9224 END IF
9225 lcmt00 = lcmt
9226 lcmt = lcmt + qnb
9227 nblks = nblkd
9228 nblkd = nblkd - 1
9229 joffa = joffd
9230 joffd = joffd + nbloc
9231 GO TO 80
9232 END IF
9233
9234 lcmt00 = lcmt00 - ( iupp - upp + pmb )
9235 mblks = mblks - 1
9236 ioffa = ioffa + imbloc
9237
9238 END IF
9239
9240 nbloc = nb
9241 110 CONTINUE
9242 IF( nblks.GT.0 ) THEN
9243 IF( nblks.EQ.1 )
9244 $ nbloc = lnbloc
9245 120 CONTINUE
9246 IF( mblks.GT.0 .AND. lcmt00.GT.upp ) THEN
9247 lcmt00 = lcmt00 - pmb
9248 mblks = mblks - 1
9249 ioffa = ioffa + mb
9250 GO TO 120
9251 END IF
9252
9253 lcmt = lcmt00
9254 mblkd = mblks
9255 ioffd = ioffa
9256
9257 mbloc = mb
9258 130 CONTINUE
9259 IF( mblkd.GT.0 .AND. lcmt.GE.low ) THEN
9260 IF( mblkd.EQ.1 )
9261 $ mbloc = lmbloc
9262 IF( lcmt.GE.0 ) THEN
9263 ijoffa = ioffd + lcmt + ( joffa - 1 ) * lda
9264 DO 140 i = 1,
min( nbloc,
max( 0, mbloc - lcmt ) )
9265 atmp = a( ijoffa + i*ldap1 )
9266 a( ijoffa + i*ldap1 ) = alpha +
9267 $
cmplx( abs( real( atmp ) ),
9268 $ abs( aimag( atmp ) ) )
9269 140 CONTINUE
9270 ELSE
9271 ijoffa = ioffd + ( joffa - lcmt - 1 ) * lda
9272 DO 150 i = 1,
min( mbloc,
max( 0, nbloc + lcmt ) )
9273 atmp = a( ijoffa + i*ldap1 )
9274 a( ijoffa + i*ldap1 ) = alpha +
9275 $
cmplx( abs( real( atmp ) ),
9276 $ abs( aimag( atmp ) ) )
9277 150 CONTINUE
9278 END IF
9279 lcmt00 = lcmt
9280 lcmt = lcmt - pmb
9281 mblks = mblkd
9282 mblkd = mblkd - 1
9283 ioffa = ioffd
9284 ioffd = ioffd + mbloc
9285 GO TO 130
9286 END IF
9287
9288 lcmt00 = lcmt00 + qnb
9289 nblks = nblks - 1
9290 joffa = joffa + nbloc
9291 GO TO 110
9292
9293 END IF
9294
9295 RETURN
9296
9297
9298
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)