913
914
915
916
917
918
919
920 LOGICAL INPLACE
921 INTEGER IA, JA, N
922 COMPLEX ALPHA
923
924
925 INTEGER DESCA( * )
926 COMPLEX A( * )
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
1041 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
1042 $ RSRC_
1043 parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
1044 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
1045 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
1046 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
1047
1048
1049 LOGICAL GODOWN, GOLEFT
1050 INTEGER I, IACOL, IAROW, ICTXT, IIA, IJOFFA, ILOW,
1051 $ IMB1, IMBLOC, INB1, INBLOC, IOFFA, IOFFD, IUPP,
1052 $ JJA, JOFFA, JOFFD, LCMT, LCMT00, LDA, LDAP1,
1053 $ LMBLOC, LNBLOC, LOW, MB, MBLKD, MBLKS, MBLOC,
1054 $ MRCOL, MRROW, MYCOL, MYROW, NB, NBLKD, NBLKS,
1055 $ NBLOC, NP, NPCOL, NPROW, NQ, PMB, QNB, UPP
1056 COMPLEX ATMP
1057
1058
1059 INTEGER DESCA2( DLEN_ )
1060
1061
1064
1065
1067
1068
1069
1070
1071
1073
1074
1075
1076 ictxt = desca2( ctxt_ )
1077 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
1078
1079 IF( n.EQ.0 )
1080 $ RETURN
1081
1082 CALL pb_ainfog2l( n, n, ia, ja, desca2, nprow, npcol, myrow,
1083 $ mycol, imb1, inb1, np, nq, iia, jja, iarow,
1084 $ iacol, mrrow, mrcol )
1085
1086
1087
1088 IF( inplace ) THEN
1089 iia = 1
1090 jja = 1
1091 END IF
1092
1093
1094
1095
1096 mb = desca2( mb_ )
1097 nb = desca2( nb_ )
1098
1099 CALL pb_binfo( 0, np, nq, imb1, inb1, mb, nb, mrrow, mrcol,
1100 $ lcmt00, mblks, nblks, imbloc, inbloc, lmbloc,
1101 $ lnbloc, ilow, low, iupp, upp )
1102
1103 ioffa = iia - 1
1104 joffa = jja - 1
1105 lda = desca2( lld_ )
1106 ldap1 = lda + 1
1107
1108 IF( desca2( rsrc_ ).LT.0 ) THEN
1109 pmb = mb
1110 ELSE
1111 pmb = nprow * mb
1112 END IF
1113 IF( desca2( csrc_ ).LT.0 ) THEN
1114 qnb = nb
1115 ELSE
1116 qnb = npcol * nb
1117 END IF
1118
1119
1120
1121
1122 godown = ( lcmt00.GT.iupp )
1123 goleft = ( lcmt00.LT.ilow )
1124
1125 IF( .NOT.godown .AND. .NOT.goleft ) THEN
1126
1127
1128
1129 IF( lcmt00.GE.0 ) THEN
1130 ijoffa = ioffa+lcmt00 + ( joffa - 1 ) * lda
1131 DO 10 i = 1,
min( inbloc,
max( 0, imbloc - lcmt00 ) )
1132 atmp = a( ijoffa + i*ldap1 )
1133 a( ijoffa + i*ldap1 ) = alpha +
1134 $
cmplx( abs( real( atmp ) ),
1135 $ abs( aimag( atmp ) ) )
1136 10 CONTINUE
1137 ELSE
1138 ijoffa = ioffa + ( joffa - lcmt00 - 1 ) * lda
1139 DO 20 i = 1,
min( imbloc,
max( 0, inbloc + lcmt00 ) )
1140 atmp = a( ijoffa + i*ldap1 )
1141 a( ijoffa + i*ldap1 ) = alpha +
1142 $
cmplx( abs( real( atmp ) ),
1143 $ abs( aimag( atmp ) ) )
1144 20 CONTINUE
1145 END IF
1146 goleft = ( ( lcmt00 - ( iupp - upp + pmb ) ).LT.ilow )
1147 godown = .NOT.goleft
1148
1149 END IF
1150
1151 IF( godown ) THEN
1152
1153 lcmt00 = lcmt00 - ( iupp - upp + pmb )
1154 mblks = mblks - 1
1155 ioffa = ioffa + imbloc
1156
1157 30 CONTINUE
1158 IF( mblks.GT.0 .AND. lcmt00.GT.upp ) THEN
1159 lcmt00 = lcmt00 - pmb
1160 mblks = mblks - 1
1161 ioffa = ioffa + mb
1162 GO TO 30
1163 END IF
1164
1165 lcmt = lcmt00
1166 mblkd = mblks
1167 ioffd = ioffa
1168
1169 mbloc = mb
1170 40 CONTINUE
1171 IF( mblkd.GT.0 .AND. lcmt.GE.ilow ) THEN
1172 IF( mblkd.EQ.1 )
1173 $ mbloc = lmbloc
1174 IF( lcmt.GE.0 ) THEN
1175 ijoffa = ioffd + lcmt + ( joffa - 1 ) * lda
1176 DO 50 i = 1,
min( inbloc,
max( 0, mbloc - lcmt ) )
1177 atmp = a( ijoffa + i*ldap1 )
1178 a( ijoffa + i*ldap1 ) = alpha +
1179 $
cmplx( abs( real( atmp ) ),
1180 $ abs( aimag( atmp ) ) )
1181 50 CONTINUE
1182 ELSE
1183 ijoffa = ioffd + ( joffa - lcmt - 1 ) * lda
1184 DO 60 i = 1,
min( mbloc,
max( 0, inbloc + lcmt ) )
1185 atmp = a( ijoffa + i*ldap1 )
1186 a( ijoffa + i*ldap1 ) = alpha +
1187 $
cmplx( abs( real( atmp ) ),
1188 $ abs( aimag( atmp ) ) )
1189 60 CONTINUE
1190 END IF
1191 lcmt00 = lcmt
1192 lcmt = lcmt - pmb
1193 mblks = mblkd
1194 mblkd = mblkd - 1
1195 ioffa = ioffd
1196 ioffd = ioffd + mbloc
1197 GO TO 40
1198 END IF
1199
1200 lcmt00 = lcmt00 + low - ilow + qnb
1201 nblks = nblks - 1
1202 joffa = joffa + inbloc
1203
1204 ELSE IF( goleft ) THEN
1205
1206 lcmt00 = lcmt00 + low - ilow + qnb
1207 nblks = nblks - 1
1208 joffa = joffa + inbloc
1209
1210 70 CONTINUE
1211 IF( nblks.GT.0 .AND. lcmt00.LT.low ) THEN
1212 lcmt00 = lcmt00 + qnb
1213 nblks = nblks - 1
1214 joffa = joffa + nb
1215 GO TO 70
1216 END IF
1217
1218 lcmt = lcmt00
1219 nblkd = nblks
1220 joffd = joffa
1221
1222 nbloc = nb
1223 80 CONTINUE
1224 IF( nblkd.GT.0 .AND. lcmt.LE.iupp ) THEN
1225 IF( nblkd.EQ.1 )
1226 $ nbloc = lnbloc
1227 IF( lcmt.GE.0 ) THEN
1228 ijoffa = ioffa + lcmt + ( joffd - 1 ) * lda
1229 DO 90 i = 1,
min( nbloc,
max( 0, imbloc - lcmt ) )
1230 atmp = a( ijoffa + i*ldap1 )
1231 a( ijoffa + i*ldap1 ) = alpha +
1232 $
cmplx( abs( real( atmp ) ),
1233 $ abs( aimag( atmp ) ) )
1234 90 CONTINUE
1235 ELSE
1236 ijoffa = ioffa + ( joffd - lcmt - 1 ) * lda
1237 DO 100 i = 1,
min( imbloc,
max( 0, nbloc + lcmt ) )
1238 atmp = a( ijoffa + i*ldap1 )
1239 a( ijoffa + i*ldap1 ) = alpha +
1240 $
cmplx( abs( real( atmp ) ),
1241 $ abs( aimag( atmp ) ) )
1242 100 CONTINUE
1243 END IF
1244 lcmt00 = lcmt
1245 lcmt = lcmt + qnb
1246 nblks = nblkd
1247 nblkd = nblkd - 1
1248 joffa = joffd
1249 joffd = joffd + nbloc
1250 GO TO 80
1251 END IF
1252
1253 lcmt00 = lcmt00 - ( iupp - upp + pmb )
1254 mblks = mblks - 1
1255 ioffa = ioffa + imbloc
1256
1257 END IF
1258
1259 nbloc = nb
1260 110 CONTINUE
1261 IF( nblks.GT.0 ) THEN
1262 IF( nblks.EQ.1 )
1263 $ nbloc = lnbloc
1264 120 CONTINUE
1265 IF( mblks.GT.0 .AND. lcmt00.GT.upp ) THEN
1266 lcmt00 = lcmt00 - pmb
1267 mblks = mblks - 1
1268 ioffa = ioffa + mb
1269 GO TO 120
1270 END IF
1271
1272 lcmt = lcmt00
1273 mblkd = mblks
1274 ioffd = ioffa
1275
1276 mbloc = mb
1277 130 CONTINUE
1278 IF( mblkd.GT.0 .AND. lcmt.GE.low ) THEN
1279 IF( mblkd.EQ.1 )
1280 $ mbloc = lmbloc
1281 IF( lcmt.GE.0 ) THEN
1282 ijoffa = ioffd + lcmt + ( joffa - 1 ) * lda
1283 DO 140 i = 1,
min( nbloc,
max( 0, mbloc - lcmt ) )
1284 atmp = a( ijoffa + i*ldap1 )
1285 a( ijoffa + i*ldap1 ) = alpha +
1286 $
cmplx( abs( real( atmp ) ),
1287 $ abs( aimag( atmp ) ) )
1288 140 CONTINUE
1289 ELSE
1290 ijoffa = ioffd + ( joffa - lcmt - 1 ) * lda
1291 DO 150 i = 1,
min( mbloc,
max( 0, nbloc + lcmt ) )
1292 atmp = a( ijoffa + i*ldap1 )
1293 a( ijoffa + i*ldap1 ) = alpha +
1294 $
cmplx( abs( real( atmp ) ),
1295 $ abs( aimag( atmp ) ) )
1296 150 CONTINUE
1297 END IF
1298 lcmt00 = lcmt
1299 lcmt = lcmt - pmb
1300 mblks = mblkd
1301 mblkd = mblkd - 1
1302 ioffa = ioffd
1303 ioffd = ioffd + mbloc
1304 GO TO 130
1305 END IF
1306
1307 lcmt00 = lcmt00 + qnb
1308 nblks = nblks - 1
1309 joffa = joffa + nbloc
1310 GO TO 110
1311
1312 END IF
1313
1314 RETURN
1315
1316
1317
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)