1080 IMPLICIT NONE
1081 INTEGER MSGTAG, MSGSOU
1082 INTEGER LBUFR, LBUFR_BYTES
1083 INTEGER BUFR( LBUFR )
1084 INTEGER MYID, SLAVEF, COMM
1085 INTEGER N, LIWW
1086 INTEGER IWCB( LIWW )
1087 INTEGER(8), intent(in) :: LWC
1088 COMPLEX W( LWC )
1089 INTEGER POSIWCB
1090 INTEGER IIPOOL, LPOOL, LPANEL_POS
1091 INTEGER IPOOL( LPOOL )
1092 INTEGER PANEL_POS( LPANEL_POS )
1093 INTEGER NBFINF, INFO(80), KEEP(500)
1094 INTEGER(8) :: POSWCB, PLEFTW
1095 INTEGER(8) KEEP8(150)
1096 REAL, INTENT(INOUT) :: DKEEP(230)
1097 INTEGER PTRICB(KEEP(28)), STEP( N ), FILS( N )
1098 INTEGER(8) :: PTRACB(KEEP(28))
1099 INTEGER FRERE(KEEP(28))
1100 INTEGER PROCNODE_STEPS(KEEP(28))
1101 INTEGER LIW
1102 INTEGER(8) :: LA
1103 INTEGER IW( LIW ), PTRIST( KEEP(28) )
1104 INTEGER(8) :: PTRFAC(KEEP(28))
1105 COMPLEX A( LA ), W2( KEEP(133) )
1106 INTEGER NRHS
1107 INTEGER MYLEAF_LEFT, MTYPE
1108 INTEGER LRHSCOMP, POSINRHSCOMP_BWD(N)
1109 COMPLEX RHSCOMP(LRHSCOMP,NRHS)
1110 LOGICAL, INTENT(IN) :: PRUN_BELOW
1111 INTEGER SIZE_TO_PROCESS
1112 LOGICAL TO_PROCESS(SIZE_TO_PROCESS), NO_CHILDREN
1113 LOGICAL, intent(in) :: FROM_PP
1114 include 'mpif.h'
1115 include 'mumps_tags.h'
1116 INTEGER POSITION, IF, INODE, IERR, LONG, DUMMY(1)
1117 INTEGER :: LIELL, K
1118 INTEGER(8) :: APOS, IST
1119 INTEGER NPIV, NROW_L, IPOS, NROW_RECU
1120 INTEGER(8) :: IFR8
1121 INTEGER I, JJ, IN, PROCDEST, J1, J2, LDA
1122 INTEGER NSLAVES, NELIM, J, POSINDICES, INODEPOS,
1123 & IPOSINRHSCOMP, IPOSINRHSCOMP_PANEL
1124 INTEGER JBDEB, JBFIN, NRHS_B, allocok
1125 INTEGER(8) :: P_UPDATE, P_SOL_MAS
1126 INTEGER :: IWHDLR, MTYPE_SLAVE, LDA_SLAVE
1127 LOGICAL FLAG
1128 COMPLEX ZERO, ALPHA, ONE
1129 PARAMETER (ZERO=(0.0E0,0.0E0),
1130 & ONE=(1.0E0,0.0E0),
1131 & ALPHA=(-1.0E0,0.0E0))
1132 INCLUDE 'mumps_headers.h'
1133 INTEGER POOL_FIRST_POS, TMP
1134 LOGICAL, DIMENSION(:), ALLOCATABLE :: DEJA_SEND
1135 INTEGER :: NCB
1136 INTEGER(8) :: APOSDEB, NBENTRIES_ALLPANELS
1137 INTEGER(8) :: PTWCB_PANEL
1138 INTEGER(8) :: PTWCB, PPIV_COURANT
1139 INTEGER LDAJ, NBJ, LIWFAC,
1140 & NBJLAST, NPIV_LAST, PANEL_SIZE,
1141 & NCB_PANEL, TYPEF
1142 LOGICAL TWOBYTWO
1143 INTEGER BEG_PANEL
1144 INTEGER IPANEL, NPANELS
1145 INTEGER TMP_NBPANELS, I_PIVRPTR, I_PIVR
1146 LOGICAL MUST_BE_PERMUTED
1147 LOGICAL COMPRESS_PANEL, LR_ACTIVATED
1148 LOGICAL OOCWRITE_COMPATIBLE_WITH_BLR
1149 LOGICAL :: ALLOW_OTHERS_TO_LEAVE
1150 LOGICAL, EXTERNAL :: MUMPS_IN_OR_ROOT_SSARBR
1151 INTEGER, EXTERNAL :: MUMPS_PROCNODE
1152 ALLOCATE(DEJA_SEND( 0:SLAVEF-1 ), stat=allocok)
1153.ne. if(allocok0) then
1154 INFO(1)=-13
1155 INFO(2)=SLAVEF
1156 WRITE(6,*) MYID,' allocation error of deja_send '
1157 & //'in bwd solve compso'
1158 GOTO 260
1159 END IF
1160 DUMMY(1)=0
1161.EQ. IF (MSGTAG TERMBWD) THEN
1162 NBFINF = NBFINF - 1
1163.EQ. ELSE IF (MSGTAG NOEUD) THEN
1164 POSITION = 0
1165 CALL MPI_UNPACK(BUFR, LBUFR_BYTES, POSITION,
1166 & INODE, 1, MPI_INTEGER,
1167 & COMM, IERR)
1168 CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
1169 & JBDEB, 1, MPI_INTEGER, COMM, IERR )
1170 CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
1171 & JBFIN, 1, MPI_INTEGER, COMM, IERR )
1172 CALL MPI_UNPACK(BUFR, LBUFR_BYTES, POSITION,
1173 & LONG, 1, MPI_INTEGER,
1174 & COMM, IERR)
1175 NRHS_B = JBFIN-JBDEB+1
1176.LT. IF ( POSIWCB - LONG 0
1177.OR..LT. & POSWCB - PLEFTW + 1_8 LONG ) THEN
1178 CALL CMUMPS_COMPSO(N, KEEP(28), IWCB,
1179 & LIWW, W, LWC,
1180 & POSWCB, POSIWCB, PTRICB, PTRACB)
1181.LT. IF (POSIWCB - LONG 0) THEN
1182 INFO(1)=-14
1183 INFO(2)=-POSIWCB + LONG
1184 WRITE(6,*) MYID,' internal error 1 in bwd solve compso'
1185 GOTO 260
1186 END IF
1187.LT. IF ( POSWCB - PLEFTW + 1_8 LONG ) THEN
1188 INFO(1) = -11
1189 CALL MUMPS_SET_IERROR(LONG + PLEFTW - POSWCB - 1_8,
1190 & INFO(2))
1191 WRITE(6,*) MYID,' internal error 2 in bwd solve compso'
1192 GOTO 260
1193 END IF
1194 ENDIF
1195 POSIWCB = POSIWCB - LONG
1196 POSWCB = POSWCB - LONG
1197.GT. IF (LONG 0) THEN
1198 CALL MPI_UNPACK(BUFR, LBUFR_BYTES, POSITION,
1199 & IWCB(POSIWCB + 1),
1200 & LONG, MPI_INTEGER, COMM, IERR)
1201 DO K=JBDEB,JBFIN
1202 CALL MPI_UNPACK(BUFR, LBUFR_BYTES, POSITION,
1203 & W(POSWCB + 1), LONG,
1204 & MPI_COMPLEX, COMM, IERR)
1205 DO JJ=0, LONG-1
1206 IPOSINRHSCOMP = abs( POSINRHSCOMP_BWD( IWCB(
1207 & POSIWCB+1+JJ ) ) )
1208.EQ..OR. IF ( (IPOSINRHSCOMP0)
1209.GT. & ( IPOSINRHSCOMPN ) ) CYCLE
1210 RHSCOMP(IPOSINRHSCOMP,K) = W(POSWCB+1+JJ)
1211 ENDDO
1212 ENDDO
1213 POSIWCB = POSIWCB + LONG
1214 POSWCB = POSWCB + LONG
1215 ENDIF
1216 POOL_FIRST_POS = IIPOOL
1217 IF ( PRUN_BELOW ) THEN
1218.NOT. IF (TO_PROCESS(STEP(INODE)))
1219 & GOTO 1010
1220 ENDIF
1221 IPOOL( IIPOOL ) = INODE
1222 IIPOOL = IIPOOL + 1
1223 1010 CONTINUE
1224 IF = FRERE( STEP(INODE) )
1225.GT. DO WHILE ( IF 0 )
1226 IF ( MUMPS_PROCNODE(PROCNODE_STEPS(STEP(IF)),
1227.eq. & KEEP(199)) MYID ) THEN
1228 IF ( PRUN_BELOW ) THEN
1229.NOT. IF (TO_PROCESS(STEP(IF))) THEN
1230 IF = FRERE(STEP(IF))
1231 CYCLE
1232 ENDIF
1233 ENDIF
1234 IPOOL( IIPOOL ) = IF
1235 IIPOOL = IIPOOL + 1
1236 END IF
1237 IF = FRERE( STEP( IF ) )
1238 END DO
1239 DO I=1,(IIPOOL-POOL_FIRST_POS)/2
1240 TMP=IPOOL(POOL_FIRST_POS+I-1)
1241 IPOOL(POOL_FIRST_POS+I-1)=IPOOL(IIPOOL-I)
1242 IPOOL(IIPOOL-I)=TMP
1243 ENDDO
1244.EQ. ELSE IF ( MSGTAG BACKSLV_MASTER2SLAVE ) THEN
1245 POSITION = 0
1246 CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
1247 & INODE, 1, MPI_INTEGER, COMM, IERR )
1248 CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
1249 & NROW_RECU, 1, MPI_INTEGER, COMM, IERR )
1250 CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
1251 & JBDEB, 1, MPI_INTEGER, COMM, IERR )
1252 CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
1253 & JBFIN, 1, MPI_INTEGER, COMM, IERR )
1254 NRHS_B = JBFIN-JBDEB+1
1255.GT. LR_ACTIVATED = (IW(PTRIST(STEP(INODE))+XXLR)0)
1256.GE. COMPRESS_PANEL = (IW(PTRIST(STEP(INODE))+XXLR)2)
1257 OOCWRITE_COMPATIBLE_WITH_BLR =
1258.NOT..OR..NOT..OR. & ( LR_ACTIVATED(COMPRESS_PANEL)
1259.EQ. & (KEEP(485)0)
1260 & )
1261 IPOS = PTRIST( STEP(INODE) ) + KEEP(IXSZ)
1262 NPIV = - IW( IPOS )
1263 NROW_L = IW( IPOS + 1 )
1264.NE. IF ( NROW_L NROW_RECU ) THEN
1265 WRITE(*,*) 'error1 : nrow l/recu=',NROW_L, NROW_RECU
1266 CALL MUMPS_ABORT()
1267 END IF
1268 LONG = NROW_L + NPIV
1269.LT. IF ( POSWCB - int(LONG,8)*int(NRHS_B,8) PLEFTW - 1_8 ) THEN
1270 CALL CMUMPS_COMPSO( N, KEEP(28), IWCB,
1271 & LIWW, W, LWC,
1272 & POSWCB, POSIWCB, PTRICB, PTRACB)
1273.LT. IF ( POSWCB - LONG*NRHS_B PLEFTW - 1_8 ) THEN
1274 INFO(1) = -11
1275 CALL MUMPS_SET_IERROR(LONG * NRHS_B- POSWCB,INFO(2))
1276 WRITE(6,*) MYID,' internal error 3 in bwd solve compso'
1277 GOTO 260
1278 END IF
1279 END IF
1280 P_UPDATE = PLEFTW
1281 P_SOL_MAS = PLEFTW + int(NPIV,8) * int(NRHS_B,8)
1282 PLEFTW = P_SOL_MAS + int(NROW_L,8) * int(NRHS_B,8)
1283 DO K=JBDEB, JBFIN
1284 CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
1285 & W( P_SOL_MAS+(K-JBDEB)*NROW_L),NROW_L,
1286 & MPI_COMPLEX,
1287 & COMM, IERR )
1288 ENDDO
1289.GT..AND. IF (KEEP(201)0OOCWRITE_COMPATIBLE_WITH_BLR) THEN
1290 CALL CMUMPS_SOLVE_GET_OOC_NODE(
1291 & INODE,PTRFAC,KEEP,A,LA,STEP,
1292 & KEEP8,N,MUST_BE_PERMUTED,IERR)
1293.LT. IF(IERR0)THEN
1294 INFO(1)=IERR
1295 INFO(2)=0
1296 GOTO 260
1297 ENDIF
1298 ENDIF
1299 APOS = PTRFAC( STEP(INODE))
1300.GE..AND. IF ( IW(PTRIST(STEP(INODE))+XXLR) 2
1301.EQ. & KEEP(485) 1 ) THEN
1302 IWHDLR = IW(PTRIST(STEP(INODE))+XXF)
1303 MTYPE_SLAVE = 0
1304 W(P_UPDATE:P_UPDATE+NPIV*NRHS_B-1)=ZERO
1305 CALL CMUMPS_SOL_SLAVE_LR_U(INODE, IWHDLR, -9999,
1306 & W, LWC,
1307 & NROW_L, NPIV,
1308 & P_SOL_MAS, P_UPDATE,
1309 & JBDEB, JBFIN,
1310 & MTYPE_SLAVE, KEEP, KEEP8,
1311 & INFO(1), INFO(2) )
1312 ELSE
1313.EQ..AND. IF (KEEP(201) 1OOCWRITE_COMPATIBLE_WITH_BLR)
1314 & THEN
1315 MTYPE_SLAVE = 1
1316 LDA_SLAVE = NROW_L
1317 ELSE
1318 MTYPE_SLAVE = 0
1319 LDA_SLAVE = NPIV
1320 ENDIF
1321 CALL CMUMPS_SOLVE_GEMM_UPDATE(
1322 & A, LA, APOS, NROW_L,
1323 & LDA_SLAVE,
1324 & NPIV,
1325 & NRHS_B, W, LWC,
1326 & P_SOL_MAS, NROW_L,
1327 & P_UPDATE, NPIV,
1328 & MTYPE_SLAVE, KEEP, ZERO)
1329 ENDIF
1330.EQ..AND. IF (KEEP(201) 1OOCWRITE_COMPATIBLE_WITH_BLR)
1331 & THEN
1332 CALL CMUMPS_FREE_FACTORS_FOR_SOLVE(INODE,PTRFAC,KEEP(28),
1333 & A,LA,.TRUE.,IERR)
1334.LT. IF(IERR0)THEN
1335 INFO(1)=IERR
1336 INFO(2)=0
1337 GOTO 260
1338 ENDIF
1339 ENDIF
1340 PLEFTW = PLEFTW - int(NROW_L,8) * int(NRHS_B,8)
1341 100 CONTINUE
1342 CALL CMUMPS_BUF_SEND_BACKVEC( NRHS_B, INODE,
1343 & W(P_UPDATE),
1344 & NPIV, NPIV,
1345 & MSGSOU,
1346 & BACKSLV_UPDATERHS,
1347 & JBDEB, JBFIN,
1348 & KEEP, COMM, IERR )
1349.EQ. IF ( IERR -1 ) THEN
1350 CALL CMUMPS_BACKSLV_RECV_AND_TREAT(
1351 & .FALSE., FLAG,
1352 & BUFR, LBUFR, LBUFR_BYTES,
1353 & MYID, SLAVEF, COMM,
1354 & N, IWCB, LIWW, POSIWCB,
1355 & W, LWC, POSWCB,
1356 & IIPOOL, NBFINF, PTRICB, PTRACB, INFO,
1357 & IPOOL, LPOOL, PANEL_POS, LPANEL_POS, STEP,
1358 & FRERE, FILS, PROCNODE_STEPS, PLEFTW,
1359 & KEEP, KEEP8, DKEEP,
1360 & PTRIST, PTRFAC, IW, LIW, A, LA, W2, MYLEAF_LEFT,
1361 & NRHS, MTYPE,
1362 & RHSCOMP, LRHSCOMP, POSINRHSCOMP_BWD,
1363 & PRUN_BELOW, TO_PROCESS, SIZE_TO_PROCESS
1364 & , FROM_PP
1365 & )
1366.LT. IF ( INFO( 1 ) 0 ) GOTO 270
1367 GOTO 100
1368.EQ. ELSE IF ( IERR -2 ) THEN
1369 INFO( 1 ) = -17
1370 INFO( 2 ) = NRHS_B * NPIV * KEEP(35) + 4 * KEEP(34)
1371 GOTO 260
1372.EQ. ELSE IF ( IERR -3 ) THEN
1373 INFO( 1 ) = -20
1374 INFO( 2 ) = NRHS_B * NPIV * KEEP(35) + 4 * KEEP(34)
1375 GOTO 260
1376 END IF
1377 PLEFTW = PLEFTW - NPIV * NRHS_B
1378.EQ. ELSE IF ( MSGTAG BACKSLV_UPDATERHS ) THEN
1379 POSITION = 0
1380 CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
1381 & INODE, 1, MPI_INTEGER, COMM, IERR )
1382.GT. LR_ACTIVATED = (IW(PTRIST(STEP(INODE))+XXLR)0)
1383.GE. COMPRESS_PANEL = (IW(PTRIST(STEP(INODE))+XXLR)2)
1384 OOCWRITE_COMPATIBLE_WITH_BLR =
1385.NOT..OR..NOT..OR. & (LR_ACTIVATED(COMPRESS_PANEL)
1386.EQ. & (KEEP(485)0)
1387 & )
1388 IPOS = PTRIST(STEP(INODE)) + 2 + KEEP(IXSZ)
1389 LIELL = IW(IPOS-2)+IW(IPOS+1)
1390 CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
1391 & NPIV, 1, MPI_INTEGER, COMM, IERR )
1392 CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
1393 & JBDEB, 1, MPI_INTEGER, COMM, IERR )
1394 CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
1395 & JBFIN, 1, MPI_INTEGER, COMM, IERR )
1396 NRHS_B = JBFIN-JBDEB+1
1397 NELIM = IW(IPOS-1)
1398 IPOS = IPOS + 1
1399 NPIV = IW(IPOS)
1400 IPOS = IPOS + 1
1401 NSLAVES = IW( IPOS + 1 )
1402 IPOS = IPOS + 1 + NSLAVES
1403 INODEPOS = PTRIST(STEP(INODE)) + KEEP(IXSZ) + 4
1404.eq. IF ( KEEP(50) 0 ) THEN
1405 LDA = LIELL
1406 ELSE
1407 LDA = NPIV
1408 ENDIF
1409.EQ..AND..EQ. IF ( MTYPE 1 KEEP(50)0 ) THEN
1410 J1 = IPOS + LIELL + 1
1411 J2 = IPOS + NPIV + LIELL
1412 ELSE
1413 J1 = IPOS + 1
1414 J2 = IPOS + NPIV
1415 ENDIF
1416 IPOSINRHSCOMP = POSINRHSCOMP_BWD(IW(J1))
1417 DO K=JBDEB, JBFIN
1418 CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
1419 & W2, NPIV, MPI_COMPLEX,
1420 & COMM, IERR )
1421 I = 1
1422.NE..AND. IF ( (KEEP(253)0)
1423.EQ. & (IW(PTRIST(STEP(INODE))+XXS)C_FINI+NSLAVES)
1424 & ) THEN
1425 DO JJ = J1,J2
1426 RHSCOMP(IPOSINRHSCOMP+JJ-J1,K) = W2(I)
1427 I = I+1
1428 ENDDO
1429 ELSE
1430 DO JJ = J1,J2
1431 RHSCOMP(IPOSINRHSCOMP+JJ-J1,K) =
1432 & RHSCOMP(IPOSINRHSCOMP+JJ-J1,K) + W2(I)
1433 I = I+1
1434 ENDDO
1435 ENDIF
1436 ENDDO
1437 IW(PTRIST(STEP(INODE))+XXS) =
1438 & IW(PTRIST(STEP(INODE))+XXS) - 1
1439.EQ. IF ( IW(PTRIST(STEP(INODE))+XXS)C_FINI ) THEN
1440.GT..AND. IF (KEEP(201)0OOCWRITE_COMPATIBLE_WITH_BLR)
1441 & THEN
1442 CALL CMUMPS_SOLVE_GET_OOC_NODE(
1443 & INODE,PTRFAC,KEEP,A,LA,STEP,
1444 & KEEP8,N,MUST_BE_PERMUTED,IERR)
1445.LT. IF(IERR0)THEN
1446 INFO(1)=IERR
1447 INFO(2)=0
1448 GOTO 260
1449 ENDIF
1450.EQ..AND..NE. IF (KEEP(201)1 KEEP(50)1) THEN
1451 CALL CMUMPS_OOC_PP_CHECK_PERM_FREED(
1452 & IW(IPOS+1+2*LIELL),
1453 & MUST_BE_PERMUTED )
1454 ENDIF
1455 ENDIF
1456 APOS = PTRFAC(IW(INODEPOS))
1457.EQ..AND. IF (KEEP(201)1OOCWRITE_COMPATIBLE_WITH_BLR)
1458 & THEN
1459 LIWFAC = IW(PTRIST(STEP(INODE))+XXI)
1460 TYPEF = TYPEF_L
1461 NROW_L = NPIV+NELIM
1462 PANEL_SIZE = CMUMPS_OOC_PANEL_SIZE(NROW_L)
1463.LT. IF (PANEL_SIZE0) THEN
1464 WRITE(6,*) ' internal error in bwd solve panel_size=',
1465 & PANEL_SIZE
1466 CALL MUMPS_ABORT()
1467 ENDIF
1468 ENDIF
1469.LT..or. IF ( POSIWCB - 2 0
1470.LT. & POSWCB-int(LIELL,8)*int(NRHS_B,8) PLEFTW-1_8 ) THEN
1471 CALL CMUMPS_COMPSO( N, KEEP(28), IWCB, LIWW, W, LWC,
1472 & POSWCB, POSIWCB, PTRICB, PTRACB )
1473.LT. IF ( POSWCB-int(LIELL,8)*int(NRHS_B,8) PLEFTW-1_8 ) THEN
1474 INFO( 1 ) = -11
1475 CALL MUMPS_SET_IERROR( int(LIELL,8)*int(NRHS_B,8)-
1476 & POSWCB-PLEFTW+1_8,
1477 & INFO(2) )
1478 GOTO 260
1479 END IF
1480.LT. IF ( POSIWCB - 2 0 ) THEN
1481 INFO( 1 ) = -14
1482 INFO( 2 ) = 2 - POSIWCB
1483 GO TO 260
1484 END IF
1485 END IF
1486 POSIWCB = POSIWCB - 2
1487 POSWCB = POSWCB - int(LIELL,8)*int(NRHS_B,8)
1488 PTRICB(STEP( INODE )) = POSIWCB + 1
1489 PTRACB(STEP( INODE )) = POSWCB + 1_8
1490 IWCB( PTRICB(STEP( INODE )) ) = LIELL*NRHS_B
1491 IWCB( PTRICB(STEP( INODE )) + 1 ) = 1
1492 IPOS = PTRIST(STEP(INODE)) + KEEP(IXSZ) + 5 + NSLAVES
1493.EQ..AND..EQ. IF ( MTYPE1 KEEP(50)0 ) THEN
1494 POSINDICES = IPOS + LIELL + 1
1495 ELSE
1496 POSINDICES = IPOS + 1
1497 END IF
1498 PTWCB = PTRACB(STEP( INODE ))
1499 IPOSINRHSCOMP = POSINRHSCOMP_BWD(IW(J1))
1500 IFR8 = PTRACB(STEP( INODE ))
1501 IFR8 = PTWCB + int(NPIV - 1,8)
1502.EQ..AND..EQ. IF ( MTYPE 1 KEEP(50)0 ) THEN
1503 J1 = IPOS + LIELL + NPIV + 1
1504 J2 = IPOS + 2 * LIELL
1505 ELSE
1506 J1 = IPOS + NPIV + 1
1507 J2 = IPOS + LIELL
1508 END IF
1509 CALL CMUMPS_SOL_BWD_GTHR( JBDEB, JBFIN, J1, J2,
1510 & RHSCOMP, NRHS, LRHSCOMP,
1511 & W(PTWCB), LIELL, NPIV+1,
1512 & IW, LIW, KEEP, N, POSINRHSCOMP_BWD )
1513 IFR8 = IFR8 + int(J2-KEEP(253)-J1+1,8)
1514.EQ..AND..AND. IF ( KEEP(201)1 OOCWRITE_COMPATIBLE_WITH_BLR
1515.GT..OR..NE. & (( NELIM 0 ) (MTYPE1 ))) THEN
1516 J = NPIV / PANEL_SIZE
1517.EQ..AND..GT. TWOBYTWO = KEEP(50)2 KEEP(105)0
1518 IF (TWOBYTWO) THEN
1519 CALL CMUMPS_BUILD_PANEL_POS(PANEL_SIZE, PANEL_POS, LPANEL_POS,
1520 & IW(IPOS+1+LIELL), NPIV, NPANELS, NROW_L,
1521 & NBENTRIES_ALLPANELS)
1522 ELSE
1523.EQ. IF (NPIVJ*PANEL_SIZE) THEN
1524 NPIV_LAST = NPIV
1525 NBJLAST = PANEL_SIZE
1526 NPANELS = J
1527 ELSE
1528 NPIV_LAST = (J+1)* PANEL_SIZE
1529 NBJLAST = NPIV-J*PANEL_SIZE
1530 NPANELS = J+1
1531 ENDIF
1532 NBENTRIES_ALLPANELS =
1533 & int(NROW_L,8) * int(NPIV,8)
1534 & - int( ( J * ( J - 1 ) ) /2,8 )
1535 & * int(PANEL_SIZE,8) * int(PANEL_SIZE,8)
1536 & - int(J,8)
1537 & * int(mod(NPIV, PANEL_SIZE),8)
1538 & * int(PANEL_SIZE,8)
1539 JJ=NPIV_LAST
1540 ENDIF
1541 APOSDEB = APOS + NBENTRIES_ALLPANELS
1542 DO IPANEL = NPANELS, 1, -1
1543 IF (TWOBYTWO) THEN
1544 NBJ = PANEL_POS(IPANEL+1)-PANEL_POS(IPANEL)
1545 BEG_PANEL = PANEL_POS(IPANEL)
1546 ELSE
1547.EQ. IF (JJNPIV_LAST) THEN
1548 NBJ = NBJLAST
1549 ELSE
1550 NBJ = PANEL_SIZE
1551 ENDIF
1552 BEG_PANEL = JJ- PANEL_SIZE+1
1553 ENDIF
1554 LDAJ = NROW_L-BEG_PANEL+1
1555 APOSDEB = APOSDEB - int(NBJ,8)*int(LDAJ,8)
1556 PTWCB = PTRACB(STEP(INODE))
1557 PTWCB_PANEL = PTRACB(STEP(INODE)) + int(BEG_PANEL - 1,8)
1558 IPOSINRHSCOMP_PANEL = IPOSINRHSCOMP + BEG_PANEL - 1
1559 NCB_PANEL = LDAJ - NBJ
1560 NCB = NROW_L - NPIV
1561.NE..AND. IF (KEEP(50)1 MUST_BE_PERMUTED) THEN
1562 CALL CMUMPS_GET_OOC_PERM_PTR(TYPEF, TMP_NBPANELS,
1563 & I_PIVRPTR, I_PIVR, IPOS + 1 + 2 * LIELL, IW, LIW)
1564 CALL CMUMPS_PERMUTE_PANEL(
1565 & IW(I_PIVR + IW(I_PIVRPTR+IPANEL-1)-IW(I_PIVRPTR)),
1566 & NPIV-IW(I_PIVRPTR+IPANEL-1)+1,
1567 & IW(I_PIVRPTR+IPANEL-1)-1,
1568 & A(APOSDEB),
1569 & LDAJ, NBJ, BEG_PANEL-1)
1570 ENDIF
1571#if defined(MUMPS_USE_BLAS2)
1572 IF ( NRHS_B == 1 ) THEN
1573.NE. IF (NCB_PANEL0) THEN
1574.NE. IF (NCB_PANEL - NCB 0) THEN
1575 CALL cgemv( 't', NCB_PANEL-NCB, NBJ, ALPHA,
1576 & A( APOSDEB + int(NBJ,8) ), LDAJ,
1577 & RHSCOMP(IPOSINRHSCOMP_PANEL+NBJ,JBDEB),
1578 & 1, ONE,
1579 & RHSCOMP(IPOSINRHSCOMP_PANEL,JBDEB), 1 )
1580 ENDIF
1581.NE. IF (NCB 0) THEN
1582 CALL cgemv( 't', NCB, NBJ, ALPHA,
1583 & A( APOSDEB + int(LDAJ-NCB,8) ), LDAJ,
1584 & W( PTWCB + int(NPIV,8) ),
1585 & 1, ONE,
1586 & RHSCOMP(IPOSINRHSCOMP_PANEL,JBDEB), 1 )
1587 ENDIF
1588 ENDIF
1589.NE. IF (MTYPE1) THEN
1590 CALL ctrsv('l','t','U', nbj, a(aposdeb), ldaj,
1591 & rhscomp(iposinrhscomp_panel,jbdeb), 1)
1592 ELSE
1593 CALL ctrsv(
'L',
'T',
'N', nbj, a(aposdeb), ldaj,
1594 & rhscomp(iposinrhscomp_panel,jbdeb), 1)
1595 ENDIF
1596 ELSE
1597#endif
1598 IF (ncb_panel.NE.0) THEN
1599 IF (ncb_panel - ncb .NE. 0) THEN
1600 CALL cgemm(
'T',
'N', nbj, nrhs_b,
1601 & ncb_panel-ncb,
alpha,
1602 & a(aposdeb +int(nbj,8)), ldaj,
1603 & rhscomp(iposinrhscomp_panel+nbj,jbdeb), lrhscomp,
1604 & one, rhscomp(iposinrhscomp_panel,jbdeb), lrhscomp)
1605 ENDIF
1606 IF (ncb .NE. 0) THEN
1607 CALL cgemm(
'T',
'N', nbj, nrhs_b, ncb,
alpha,
1608 & a(aposdeb +int(ldaj-ncb,8)), ldaj,
1609 & w( ptwcb+int(npiv,8) ), liell,
1610 & one, rhscomp(iposinrhscomp_panel,jbdeb),lrhscomp)
1611 ENDIF
1612 ENDIF
1613 IF (mtype.NE.1) THEN
1614 CALL ctrsm(
'L',
'L',
'T',
'U',nbj, nrhs_b, one,
1615 & a(aposdeb),
1616 & ldaj, rhscomp(iposinrhscomp_panel,jbdeb), lrhscomp)
1617 ELSE
1618 CALL ctrsm(
'L',
'L',
'T',
'N',nbj, nrhs_b, one,
1619 & a(aposdeb),
1620 & ldaj, rhscomp(iposinrhscomp_panel,jbdeb), lrhscomp)
1621 ENDIF
1622#if defined(MUMPS_USE_BLAS2)
1623 ENDIF
1624#endif
1625 IF (.NOT. twobytwo) jj=beg_panel-1
1626 ENDDO
1627 GOTO 1234
1628 ENDIF
1629 IF ( iw(ptrist(step(inode))+xxlr) .GE. 2
1630 & .AND. keep(485) .EQ. 1 ) THEN
1631 iwhdlr = iw(ptrist(step(inode))+xxf)
1633 & inode, iwhdlr, npiv, nslaves,
1634 & liell, w, lwc, nrhs_b, ptracb(step(inode)),
1635 & rhscomp, lrhscomp, nrhs,
1636 & iposinrhscomp, jbdeb,
1637 & mtype, keep, keep8,
1638 & info(1), info(2) )
1639 ELSE
1640 IF (nelim .GT.0) THEN
1641 IF ( keep(50) .eq. 0 ) THEN
1642 ist = apos + int(npiv,8) * int(liell,8)
1643 ELSE
1644 IF( keep(459) .GT. 1) THEN
1645 CALL mumps_geti8(ist, iw(ptrist(step(inode))+xxr))
1646 ist = apos + ist - int(npiv,8) * int(nelim,8)
1647 ELSE
1648 ist = apos + int(npiv,8) * int(npiv,8)
1649 ENDIF
1650 END IF
1651#if defined(MUMPS_USE_BLAS2)
1652 IF ( nrhs_b == 1 ) THEN
1653 CALL cgemv(
'N', npiv, nelim,
alpha, a( ist ), npiv,
1654 & w( npiv + ptracb(step(inode)) ),
1655 & 1, one,
1656 & rhscomp(iposinrhscomp,jbdeb), 1 )
1657 ELSE
1658#endif
1659 CALL cgemm(
'N',
'N', npiv, nrhs_b, nelim,
alpha,
1660 & a(ist), npiv, w(npiv+ptracb(step(inode))), liell,
1661 & one, rhscomp(iposinrhscomp,jbdeb), lrhscomp)
1662#if defined(MUMPS_USE_BLAS2)
1663 END IF
1664#endif
1665 ENDIF
1666 ppiv_courant = int(jbdeb-1,8)*int(lrhscomp,8)
1667 & + int(iposinrhscomp,8)
1668 IF (keep(459).GT.1 .AND. keep(50).NE.0) THEN
1670 & npiv, iw(ipos+1+liell),
1671 & nrhs_b, rhscomp(1,1), keep8(25), lrhscomp, ppiv_courant,
1672 & mtype, keep )
1673 ELSE
1675 & npiv, lda,
1676 & nrhs_b, rhscomp(1,1), keep8(25), lrhscomp, ppiv_courant,
1677 & mtype, keep )
1678 ENDIF
1679 ENDIF
1680 1234 CONTINUE
1681 IF (keep(201).GT.0.AND.oocwrite_compatible_with_blr) THEN
1683 & a,la,.true.,ierr)
1684 IF(ierr.LT.0)THEN
1685 info(1)=ierr
1686 info(2)=0
1687 GOTO 260
1688 ENDIF
1689 ENDIF
1690 ipos = ptrist(step(inode)) + keep(ixsz) + 6 + nslaves
1691 iposinrhscomp = posinrhscomp_bwd(iw(ipos))
1692 in = inode
1693 170 in = fils(in)
1694 IF (in .GT. 0) GOTO 170
1695 IF (in .EQ. 0) THEN
1696 myleaf_left = myleaf_left - 1
1697 allow_others_to_leave = ( myleaf_left .EQ. 0 .AND.
1698 & keep(31) .EQ. 0 )
1699 IF (keep(31) .NE. 0) THEN
1701 & procnode_steps(step(inode)),
1702 & keep(199) ) ) THEN
1703 keep(31) = keep(31) - 1
1704 IF (keep(31) .EQ. 1) THEN
1705 allow_others_to_leave = .true.
1706 ENDIF
1707 ENDIF
1708 ENDIF
1709 IF ( allow_others_to_leave ) THEN
1711 & termbwd, slavef, keep )
1712 nbfinf = nbfinf - 1
1713 ENDIF
1714 iwcb( ptricb(step(inode)) + 1 ) = 0
1716 & iwcb, liww, w, lwc,
1717 & poswcb, posiwcb, ptricb, ptracb)
1718 GOTO 270
1719 ENDIF
1720 DO i = 0, slavef - 1
1721 deja_send( i ) = .false.
1722 END DO
1723 in = -in
1724 IF ( prun_below ) THEN
1725 no_children = .true.
1726 ELSE
1727 no_children = .false.
1728 ENDIF
1729 DO WHILE (in.GT.0)
1730 IF ( prun_below ) THEN
1731 IF ( .NOT.to_process(step(in)) ) THEN
1732 in = frere(step(in))
1733 cycle
1734 ELSE
1735 no_children = .false.
1736 ENDIF
1737 ENDIF
1738 pool_first_pos = iipool
1740 & keep(199)) .EQ. myid) THEN
1741 ipool(iipool ) = in
1742 iipool = iipool + 1
1743 ELSE
1745 & keep(199) )
1746 IF ( .NOT. deja_send( procdest ) ) THEN
1747 400 CONTINUE
1749 & liell, liell - keep(253),
1750 & iw( posindices ),
1751 & w( ptracb(step(inode)) ), jbdeb, jbfin,
1752 & rhscomp(1, 1), nrhs, lrhscomp,
1753 & iposinrhscomp, npiv,
1754 & keep, procdest, noeud, comm, ierr )
1755 IF ( ierr .EQ. -1 ) THEN
1757 & .false., flag,
1758 & bufr, lbufr, lbufr_bytes,
1759 & myid, slavef, comm,
1760 & n, iwcb, liww, posiwcb,
1761 & w, lwc, poswcb,
1762 & iipool, nbfinf, ptricb, ptracb, info,
1763 & ipool, lpool, panel_pos, lpanel_pos,
1764 & step, frere, fils, procnode_steps,
1765 & pleftw, keep, keep8, dkeep,
1766 & ptrist, ptrfac, iw, liw, a, la, w2, myleaf_left,
1767 & nrhs, mtype,
1768 & rhscomp, lrhscomp, posinrhscomp_bwd,
1769 & prun_below, to_process, size_to_process
1770 & , from_pp
1771 & )
1772 IF ( info( 1 ) .LT. 0 ) THEN
1773 GOTO 270
1774 ENDIF
1775 GOTO 400
1776 ELSE IF ( ierr .EQ. -2 ) THEN
1777 info( 1 ) = -17
1778 info( 2 ) = nrhs_b * liell * keep(35) + 4 * keep(34)
1779 GOTO 260
1780 ELSE IF ( ierr .EQ. -3 ) THEN
1781 info( 1 ) = -20
1782 info( 2 ) = nrhs_b * liell * keep(35) + 4 * keep(34)
1783 GOTO 260
1784 END IF
1785 deja_send( procdest ) = .true.
1786 END IF
1787 END IF
1788 in = frere( step( in ) )
1789 END DO
1790 allow_others_to_leave = .false.
1791 IF (no_children) THEN
1792 myleaf_left = myleaf_left - 1
1793 allow_others_to_leave = ( myleaf_left .EQ. 0 .AND.
1794 & keep(31) .EQ. 0 )
1795 ENDIF
1796 IF (keep(31) .NE. 0) THEN
1798 & procnode_steps(step(inode)),
1799 & keep(199) ) ) THEN
1800 keep(31) = keep(31) - 1
1801 IF (keep(31) .EQ. 1) THEN
1802 allow_others_to_leave = .true.
1803 ENDIF
1804 ENDIF
1805 ENDIF
1806 IF ( allow_others_to_leave ) THEN
1808 & comm, termbwd, slavef, keep )
1809 nbfinf = nbfinf - 1
1810 ENDIF
1811 IF ( .NOT. no_children ) THEN
1812 DO i=1,(iipool-pool_first_pos)/2
1813 tmp=ipool(pool_first_pos+i-1)
1814 ipool(pool_first_pos+i-1)=ipool(iipool-i)
1815 ipool(iipool-i)=tmp
1816 ENDDO
1817 ENDIF
1818 iwcb( ptricb(step( inode )) + 1 ) = 0
1820 & iwcb, liww, w, lwc,
1821 & poswcb, posiwcb, ptricb, ptracb)
1822 END IF
1823 ELSE IF (msgtag.EQ.terreur) THEN
1824 info(1) = -001
1825 info(2) = msgsou
1826 GO TO 270
1827 ELSE IF ( (msgtag.EQ.update_load).OR.
1828 & (msgtag.EQ.tag_dummy) ) THEN
1829 GO TO 270
1830 ELSE
1831 info(1) = -100
1832 info(2) = msgtag
1833 GOTO 260
1834 ENDIF
1835 GO TO 270
1836 260 CONTINUE
1837 IF (nbfinf .NE. 0) THEN
1839 ENDIF
1840 270 CONTINUE
1841 IF (allocated(deja_send)) DEALLOCATE(deja_send)
1842 RETURN
subroutine cmumps_mcast2(data, ldata, mpitype, root, commw, tag, slavef, keep)
subroutine cmumps_solve_bwd_panels(a, la, apos, npiv, iw, nrhs_b, wcb, lwcb, lda_wcb, ppiv_courant, mtype, keep)
subroutine cmumps_freetopso(n, keep28, iwcb, liww, w, lwc, poswcb, iwposcb, ptricb, ptracb)
subroutine cmumps_solve_bwd_trsolve(a, la, apos, npiv, ldadiag, nrhs_b, wcb, lwcb, lda_wcb, ppiv_courant, mtype, keep)
recursive subroutine cmumps_backslv_recv_and_treat(bloq, flag, bufr, lbufr, lbufr_bytes, myid, slavef, comm, n, iwcb, liww, posiwcb, w, lwc, poswcb, iipool, nbfinf, ptricb, ptracb, info, ipool, lpool, panel_pos, lpanel_pos, step, frere, fils, procnode_steps, pleftw, keep, keep8, dkeep, ptrist, ptrfac, iw, liw, a, la, w2, myleaf_left, nrhs, mtype, rhscomp, lrhscomp, posinrhscomp_bwd, prun_below, to_process, size_to_process, from_pp)
subroutine cgemv(trans, m, n, alpha, a, lda, x, incx, beta, y, incy)
CGEMV
subroutine ctrsv(uplo, trans, diag, n, a, lda, x, incx)
CTRSV
subroutine ctrsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
CTRSM
subroutine cgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
CGEMM
subroutine, public cmumps_buf_send_vcb(nrhs_b, node1, node2, ncb, ldw, long, iw, w, jbdeb, jbfin, rhscomp, nrhs, lrhscomp, iposinrhscomp, npiv, keep, dest, tag, comm, ierr)
subroutine cmumps_free_factors_for_solve(inode, ptrfac, nsteps, a, la, flag, ierr)
subroutine cmumps_sol_slave_lr_u(inode, iwhdlr, npiv_global, wcb, lwcb, ldx, ldy, ptrx_init, ptry_init, jbdeb, jbfin, mtype, keep, keep8, iflag, ierror)
subroutine cmumps_sol_bwd_lr_su(inode, iwhdlr, npiv_global, nslaves, liell, wcb, lwcb, nrhs_b, ptwcb, rhscomp, lrhscomp, nrhs, iposinrhscomp, jbdeb, mtype, keep, keep8, iflag, ierror)