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