914
915
916
917
918
919
920
921 LOGICAL INPLACE
922 INTEGER IA, JA, N
923 COMPLEX*16 ALPHA
924
925
926 INTEGER DESCA( * )
927 COMPLEX*16 A( * )
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
1041 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
1042 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
1043 $ RSRC_
1044 parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
1045 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
1046 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
1047 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
1048
1049
1050 LOGICAL GODOWN, GOLEFT
1051 INTEGER I, IACOL, IAROW, ICTXT, IIA, IJOFFA, ILOW,
1052 $ IMB1, IMBLOC, INB1, INBLOC, IOFFA, IOFFD, IUPP,
1053 $ JJA, JOFFA, JOFFD, LCMT, LCMT00, LDA, LDAP1,
1054 $ LMBLOC, LNBLOC, LOW, MB, MBLKD, MBLKS, MBLOC,
1055 $ MRCOL, MRROW, MYCOL, MYROW, NB, NBLKD, NBLKS,
1056 $ NBLOC, NP, NPCOL, NPROW, NQ, PMB, QNB, UPP
1057 COMPLEX*16 ATMP
1058
1059
1060 INTEGER DESCA2( DLEN_ )
1061
1062
1065
1066
1067 INTRINSIC abs, dble, dcmplx, dimag,
max,
min
1068
1069
1070
1071
1072
1074
1075
1076
1077 ictxt = desca2( ctxt_ )
1078 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
1079
1080 IF( n.EQ.0 )
1081 $ RETURN
1082
1083 CALL pb_ainfog2l( n, n, ia, ja, desca2, nprow, npcol, myrow,
1084 $ mycol, imb1, inb1, np, nq, iia, jja, iarow,
1085 $ iacol, mrrow, mrcol )
1086
1087
1088
1089 IF( inplace ) THEN
1090 iia = 1
1091 jja = 1
1092 END IF
1093
1094
1095
1096
1097 mb = desca2( mb_ )
1098 nb = desca2( nb_ )
1099
1100 CALL pb_binfo( 0, np, nq, imb1, inb1, mb, nb, mrrow, mrcol,
1101 $ lcmt00, mblks, nblks, imbloc, inbloc, lmbloc,
1102 $ lnbloc, ilow, low, iupp, upp )
1103
1104 ioffa = iia - 1
1105 joffa = jja - 1
1106 lda = desca2( lld_ )
1107 ldap1 = lda + 1
1108
1109 IF( desca2( rsrc_ ).LT.0 ) THEN
1110 pmb = mb
1111 ELSE
1112 pmb = nprow * mb
1113 END IF
1114 IF( desca2( csrc_ ).LT.0 ) THEN
1115 qnb = nb
1116 ELSE
1117 qnb = npcol * nb
1118 END IF
1119
1120
1121
1122
1123 godown = ( lcmt00.GT.iupp )
1124 goleft = ( lcmt00.LT.ilow )
1125
1126 IF( .NOT.godown .AND. .NOT.goleft ) THEN
1127
1128
1129
1130 IF( lcmt00.GE.0 ) THEN
1131 ijoffa = ioffa+lcmt00 + ( joffa - 1 ) * lda
1132 DO 10 i = 1,
min( inbloc,
max( 0, imbloc - lcmt00 ) )
1133 atmp = a( ijoffa + i*ldap1 )
1134 a( ijoffa + i*ldap1 ) = alpha +
1135 $ dcmplx( abs( dble( atmp ) ),
1136 $ abs( dimag( atmp ) ) )
1137 10 CONTINUE
1138 ELSE
1139 ijoffa = ioffa + ( joffa - lcmt00 - 1 ) * lda
1140 DO 20 i = 1,
min( imbloc,
max( 0, inbloc + lcmt00 ) )
1141 atmp = a( ijoffa + i*ldap1 )
1142 a( ijoffa + i*ldap1 ) = alpha +
1143 $ dcmplx( abs( dble( atmp ) ),
1144 $ abs( dimag( atmp ) ) )
1145 20 CONTINUE
1146 END IF
1147 goleft = ( ( lcmt00 - ( iupp - upp + pmb ) ).LT.ilow )
1148 godown = .NOT.goleft
1149
1150 END IF
1151
1152 IF( godown ) THEN
1153
1154 lcmt00 = lcmt00 - ( iupp - upp + pmb )
1155 mblks = mblks - 1
1156 ioffa = ioffa + imbloc
1157
1158 30 CONTINUE
1159 IF( mblks.GT.0 .AND. lcmt00.GT.upp ) THEN
1160 lcmt00 = lcmt00 - pmb
1161 mblks = mblks - 1
1162 ioffa = ioffa + mb
1163 GO TO 30
1164 END IF
1165
1166 lcmt = lcmt00
1167 mblkd = mblks
1168 ioffd = ioffa
1169
1170 mbloc = mb
1171 40 CONTINUE
1172 IF( mblkd.GT.0 .AND. lcmt.GE.ilow ) THEN
1173 IF( mblkd.EQ.1 )
1174 $ mbloc = lmbloc
1175 IF( lcmt.GE.0 ) THEN
1176 ijoffa = ioffd + lcmt + ( joffa - 1 ) * lda
1177 DO 50 i = 1,
min( inbloc,
max( 0, mbloc - lcmt ) )
1178 atmp = a( ijoffa + i*ldap1 )
1179 a( ijoffa + i*ldap1 ) = alpha +
1180 $ dcmplx( abs( dble( atmp ) ),
1181 $ abs( dimag( atmp ) ) )
1182 50 CONTINUE
1183 ELSE
1184 ijoffa = ioffd + ( joffa - lcmt - 1 ) * lda
1185 DO 60 i = 1,
min( mbloc,
max( 0, inbloc + lcmt ) )
1186 atmp = a( ijoffa + i*ldap1 )
1187 a( ijoffa + i*ldap1 ) = alpha +
1188 $ dcmplx( abs( dble( atmp ) ),
1189 $ abs( dimag( atmp ) ) )
1190 60 CONTINUE
1191 END IF
1192 lcmt00 = lcmt
1193 lcmt = lcmt - pmb
1194 mblks = mblkd
1195 mblkd = mblkd - 1
1196 ioffa = ioffd
1197 ioffd = ioffd + mbloc
1198 GO TO 40
1199 END IF
1200
1201 lcmt00 = lcmt00 + low - ilow + qnb
1202 nblks = nblks - 1
1203 joffa = joffa + inbloc
1204
1205 ELSE IF( goleft ) THEN
1206
1207 lcmt00 = lcmt00 + low - ilow + qnb
1208 nblks = nblks - 1
1209 joffa = joffa + inbloc
1210
1211 70 CONTINUE
1212 IF( nblks.GT.0 .AND. lcmt00.LT.low ) THEN
1213 lcmt00 = lcmt00 + qnb
1214 nblks = nblks - 1
1215 joffa = joffa + nb
1216 GO TO 70
1217 END IF
1218
1219 lcmt = lcmt00
1220 nblkd = nblks
1221 joffd = joffa
1222
1223 nbloc = nb
1224 80 CONTINUE
1225 IF( nblkd.GT.0 .AND. lcmt.LE.iupp ) THEN
1226 IF( nblkd.EQ.1 )
1227 $ nbloc = lnbloc
1228 IF( lcmt.GE.0 ) THEN
1229 ijoffa = ioffa + lcmt + ( joffd - 1 ) * lda
1230 DO 90 i = 1,
min( nbloc,
max( 0, imbloc - lcmt ) )
1231 atmp = a( ijoffa + i*ldap1 )
1232 a( ijoffa + i*ldap1 ) = alpha +
1233 $ dcmplx( abs( dble( atmp ) ),
1234 $ abs( dimag( atmp ) ) )
1235 90 CONTINUE
1236 ELSE
1237 ijoffa = ioffa + ( joffd - lcmt - 1 ) * lda
1238 DO 100 i = 1,
min( imbloc,
max( 0, nbloc + lcmt ) )
1239 atmp = a( ijoffa + i*ldap1 )
1240 a( ijoffa + i*ldap1 ) = alpha +
1241 $ dcmplx( abs( dble( atmp ) ),
1242 $ abs( dimag( atmp ) ) )
1243 100 CONTINUE
1244 END IF
1245 lcmt00 = lcmt
1246 lcmt = lcmt + qnb
1247 nblks = nblkd
1248 nblkd = nblkd - 1
1249 joffa = joffd
1250 joffd = joffd + nbloc
1251 GO TO 80
1252 END IF
1253
1254 lcmt00 = lcmt00 - ( iupp - upp + pmb )
1255 mblks = mblks - 1
1256 ioffa = ioffa + imbloc
1257
1258 END IF
1259
1260 nbloc = nb
1261 110 CONTINUE
1262 IF( nblks.GT.0 ) THEN
1263 IF( nblks.EQ.1 )
1264 $ nbloc = lnbloc
1265 120 CONTINUE
1266 IF( mblks.GT.0 .AND. lcmt00.GT.upp ) THEN
1267 lcmt00 = lcmt00 - pmb
1268 mblks = mblks - 1
1269 ioffa = ioffa + mb
1270 GO TO 120
1271 END IF
1272
1273 lcmt = lcmt00
1274 mblkd = mblks
1275 ioffd = ioffa
1276
1277 mbloc = mb
1278 130 CONTINUE
1279 IF( mblkd.GT.0 .AND. lcmt.GE.low ) THEN
1280 IF( mblkd.EQ.1 )
1281 $ mbloc = lmbloc
1282 IF( lcmt.GE.0 ) THEN
1283 ijoffa = ioffd + lcmt + ( joffa - 1 ) * lda
1284 DO 140 i = 1,
min( nbloc,
max( 0, mbloc - lcmt ) )
1285 atmp = a( ijoffa + i*ldap1 )
1286 a( ijoffa + i*ldap1 ) = alpha +
1287 $ dcmplx( abs( dble( atmp ) ),
1288 $ abs( dimag( atmp ) ) )
1289 140 CONTINUE
1290 ELSE
1291 ijoffa = ioffd + ( joffa - lcmt - 1 ) * lda
1292 DO 150 i = 1,
min( mbloc,
max( 0, nbloc + lcmt ) )
1293 atmp = a( ijoffa + i*ldap1 )
1294 a( ijoffa + i*ldap1 ) = alpha +
1295 $ dcmplx( abs( dble( atmp ) ),
1296 $ abs( dimag( atmp ) ) )
1297 150 CONTINUE
1298 END IF
1299 lcmt00 = lcmt
1300 lcmt = lcmt - pmb
1301 mblks = mblkd
1302 mblkd = mblkd - 1
1303 ioffa = ioffd
1304 ioffd = ioffd + mbloc
1305 GO TO 130
1306 END IF
1307
1308 lcmt00 = lcmt00 + qnb
1309 nblks = nblks - 1
1310 joffa = joffa + nbloc
1311 GO TO 110
1312
1313 END IF
1314
1315 RETURN
1316
1317
1318
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)