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 if(allocok.ne.0) 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 IF (msgtag .EQ. termbwd) THEN
1162 nbfinf = nbfinf - 1
1163 ELSE IF (msgtag .EQ. noeud) THEN
1164 position = 0
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 )
1173 & long, 1, mpi_integer,
1174 & comm, ierr)
1175 nrhs_b = jbfin-jbdeb+1
1176 IF ( posiwcb - long .LT. 0
1177 & .OR. poswcb - pleftw + 1_8 .LT. long ) THEN
1179 & liww, w, lwc,
1180 & poswcb, posiwcb, ptricb, ptracb)
1181 IF (posiwcb - long .LT. 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 IF ( poswcb - pleftw + 1_8 .LT. long ) THEN
1188 info(1) = -11
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 IF (long .GT. 0) THEN
1199 & iwcb(posiwcb + 1),
1200 & long, mpi_integer, comm, ierr)
1201 DO k=jbdeb,jbfin
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 IF ( (iposinrhscomp.EQ.0) .OR.
1209 & ( iposinrhscomp.GT.n ) ) 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 IF (.NOT.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 DO WHILE ( IF .GT. 0 )
1227 & keep(199)) .eq. myid ) THEN
1228 IF ( prun_below ) THEN
1229 IF (.NOT.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 ELSE IF ( msgtag .EQ. 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 lr_activated = (iw(ptrist(step(inode))+xxlr).GT.0)
1256 compress_panel = (iw(ptrist(step(inode))+xxlr).GE.2)
1257 oocwrite_compatible_with_blr =
1258 & ( .NOT.lr_activated.OR.(.NOT.compress_panel).OR.
1259 & (keep(485).EQ.0)
1260 & )
1261 ipos = ptrist( step(inode) ) + keep(ixsz)
1262 npiv = - iw( ipos )
1263 nrow_l = iw( ipos + 1 )
1264 IF ( nrow_l .NE. nrow_recu ) THEN
1265 WRITE(*,*) 'Error1 : NROW L/RECU=',nrow_l, nrow_recu
1267 END IF
1268 long = nrow_l + npiv
1269 IF ( poswcb - int(long,8)*int(nrhs_b,8) .LT. pleftw - 1_8 ) THEN
1271 & liww, w, lwc,
1272 & poswcb, posiwcb, ptricb, ptracb)
1273 IF ( poswcb - long*nrhs_b .LT. pleftw - 1_8 ) THEN
1274 info(1) = -11
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 IF (keep(201).GT.0.AND.oocwrite_compatible_with_blr) THEN
1291 & inode,ptrfac,keep,a,la,step,
1292 & keep8,n,must_be_permuted,ierr)
1293 IF(ierr.LT.0)THEN
1294 info(1)=ierr
1295 info(2)=0
1296 GOTO 260
1297 ENDIF
1298 ENDIF
1299 apos = ptrfac( step(inode))
1300 IF ( iw(ptrist(step(inode))+xxlr) .GE. 2 .AND.
1301 & keep(485) .EQ. 1 ) THEN
1302 iwhdlr = iw(ptrist(step(inode))+xxf)
1303 mtype_slave = 0
1304 w(p_update:p_update+npiv*nrhs_b-1)=zero
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 IF (keep(201) .EQ. 1.AND.oocwrite_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
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 IF (keep(201) .EQ. 1.AND.oocwrite_compatible_with_blr)
1331 & THEN
1333 & a,la,.true.,ierr)
1334 IF(ierr.LT.0)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
1343 & w(p_update),
1344 & npiv, npiv,
1345 & msgsou,
1346 & backslv_updaterhs,
1347 & jbdeb, jbfin,
1348 & keep, comm, ierr )
1349 IF ( ierr .EQ. -1 ) THEN
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 IF ( info( 1 ) .LT. 0 ) GOTO 270
1367 GOTO 100
1368 ELSE IF ( ierr .EQ. -2 ) THEN
1369 info( 1 ) = -17
1370 info( 2 ) = nrhs_b * npiv * keep(35) + 4 * keep(34)
1371 GOTO 260
1372 ELSE IF ( ierr .EQ. -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 ELSE IF ( msgtag .EQ. backslv_updaterhs ) THEN
1379 position = 0
1380 CALL mpi_unpack( bufr, lbufr_bytes, position,
1381 & inode, 1, mpi_integer, comm, ierr )
1382 lr_activated = (iw(ptrist(step(inode))+xxlr).GT.0)
1383 compress_panel = (iw(ptrist(step(inode))+xxlr).GE.2)
1384 oocwrite_compatible_with_blr =
1385 & (.NOT.lr_activated.OR.(.NOT.compress_panel).OR.
1386 & (keep(485).EQ.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 IF ( keep(50) .eq. 0 ) THEN
1405 lda = liell
1406 ELSE
1407 lda = npiv
1408 ENDIF
1409 IF ( mtype .EQ. 1 .AND. keep(50).EQ.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 IF ( (keep(253).NE.0) .AND.
1423 & (iw(ptrist(step(inode))+xxs).EQ.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 IF ( iw(ptrist(step(inode))+xxs).EQ.c_fini ) THEN
1440 IF (keep(201).GT.0.AND.oocwrite_compatible_with_blr)
1441 & THEN
1443 & inode,ptrfac,keep,a,la,step,
1444 & keep8,n,must_be_permuted,ierr)
1445 IF(ierr.LT.0)THEN
1446 info(1)=ierr
1447 info(2)=0
1448 GOTO 260
1449 ENDIF
1450 IF (keep(201).EQ.1 .AND. keep(50).NE.1) THEN
1452 & iw(ipos+1+2*liell),
1453 & must_be_permuted )
1454 ENDIF
1455 ENDIF
1456 apos = ptrfac(iw(inodepos))
1457 IF (keep(201).EQ.1.AND.oocwrite_compatible_with_blr)
1458 & THEN
1459 liwfac = iw(ptrist(step(inode))+xxi)
1460 typef = typef_l
1461 nrow_l = npiv+nelim
1463 IF (panel_size.LT.0) THEN
1464 WRITE(6,*) ' Internal error in bwd solve PANEL_SIZE=',
1465 & panel_size
1467 ENDIF
1468 ENDIF
1469 IF ( posiwcb - 2 .LT. 0 .or.
1470 & poswcb-int(liell,8)*int(nrhs_b,8) .LT. pleftw-1_8 ) THEN
1472 & poswcb, posiwcb, ptricb, ptracb )
1473 IF ( poswcb-int(liell,8)*int(nrhs_b,8) .LT. pleftw-1_8 ) THEN
1474 info( 1 ) = -11
1476 & poswcb-pleftw+1_8,
1477 & info(2) )
1478 GOTO 260
1479 END IF
1480 IF ( posiwcb - 2 .LT. 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 IF ( mtype.EQ.1 .AND. keep(50).EQ.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 IF ( mtype .EQ. 1 .AND. keep(50).EQ.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
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 IF ( keep(201).EQ.1 .AND. oocwrite_compatible_with_blr .AND.
1515 & (( nelim .GT. 0 ).OR. (mtype.NE.1 ))) THEN
1516 j = npiv / panel_size
1517 twobytwo = keep(50).EQ.2 .AND. keep(105).GT.0
1518 IF (twobytwo) THEN
1520 & iw(ipos+1+liell), npiv, npanels, nrow_l,
1521 & nbentries_allpanels)
1522 ELSE
1523 IF (npiv.EQ.j*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 IF (jj.EQ.npiv_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 IF (keep(50).NE.1 .AND.must_be_permuted) THEN
1563 & i_pivrptr, i_pivr, ipos + 1 + 2 * liell, iw, liw)
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 IF (ncb_panel.NE.0) THEN
1574 IF (ncb_panel - ncb.NE. 0) THEN
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 IF (ncb .NE. 0) THEN
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 IF (mtype.NE.1) 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.NE. IF (NCB_PANEL0) THEN
1599.NE. IF (NCB_PANEL - NCB 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.NE. IF (NCB 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.NE. IF (MTYPE1) 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.NOT. IF ( TWOBYTWO) JJ=BEG_PANEL-1
1626 ENDDO
1627 GOTO 1234
1628 ENDIF
1629.GE. IF ( IW(PTRIST(STEP(INODE))+XXLR) 2
1630.AND..EQ. & KEEP(485) 1 ) THEN
1631 IWHDLR = IW(PTRIST(STEP(INODE))+XXF)
1632 CALL CMUMPS_SOL_BWD_LR_SU (
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.GT. IF (NELIM 0) THEN
1641.eq. IF ( KEEP(50) 0 ) THEN
1642 IST = APOS + int(NPIV,8) * int(LIELL,8)
1643 ELSE
1644.GT. IF( KEEP(459) 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.GT..AND..NE. IF (KEEP(459)1 KEEP(50)0) THEN
1669 CALL CMUMPS_SOLVE_BWD_PANELS( A, LA, APOS,
1670 & NPIV, IW(IPOS+1+LIELL),
1671 & NRHS_B, RHSCOMP(1,1), KEEP8(25), LRHSCOMP, PPIV_COURANT,
1672 & MTYPE, KEEP )
1673 ELSE
1674 CALL CMUMPS_SOLVE_BWD_TRSOLVE( A, LA, APOS,
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.GT..AND. IF (KEEP(201)0OOCWRITE_COMPATIBLE_WITH_BLR) THEN
1682 CALL CMUMPS_FREE_FACTORS_FOR_SOLVE(INODE,PTRFAC,KEEP(28),
1683 & A,LA,.TRUE.,IERR)
1684.LT. IF(IERR0)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.GT. IF (IN 0) GOTO 170
1695.EQ. IF (IN 0) THEN
1696 MYLEAF_LEFT = MYLEAF_LEFT - 1
1697.EQ..AND. ALLOW_OTHERS_TO_LEAVE = ( MYLEAF_LEFT 0
1698.EQ. & KEEP(31) 0 )
1699.NE. IF (KEEP(31) 0) THEN
1700.NOT. IF ( MUMPS_IN_OR_ROOT_SSARBR(
1701 & PROCNODE_STEPS(STEP(INODE)),
1702 & KEEP(199) ) ) THEN
1703 KEEP(31) = KEEP(31) - 1
1704.EQ. IF (KEEP(31) 1) THEN
1705 ALLOW_OTHERS_TO_LEAVE = .TRUE.
1706 ENDIF
1707 ENDIF
1708 ENDIF
1709 IF ( ALLOW_OTHERS_TO_LEAVE ) THEN
1710 CALL CMUMPS_MCAST2( DUMMY, 1, MPI_INTEGER, MYID, COMM,
1711 & TERMBWD, SLAVEF, KEEP )
1712 NBFINF = NBFINF - 1
1713 ENDIF
1714 IWCB( PTRICB(STEP(INODE)) + 1 ) = 0
1715 CALL CMUMPS_FREETOPSO(N, KEEP(28),
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.GT. DO WHILE (IN0)
1730 IF ( PRUN_BELOW ) THEN
1731.NOT. IF ( 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
1739 IF (MUMPS_PROCNODE(PROCNODE_STEPS(STEP(IN)),
1740.EQ. & KEEP(199)) MYID) THEN
1741 IPOOL(IIPOOL ) = IN
1742 IIPOOL = IIPOOL + 1
1743 ELSE
1744 PROCDEST = MUMPS_PROCNODE( PROCNODE_STEPS(STEP(IN)),
1745 & KEEP(199) )
1746.NOT. IF ( DEJA_SEND( PROCDEST ) ) THEN
1747 400 CONTINUE
1748 CALL CMUMPS_BUF_SEND_VCB( NRHS_B, IN, 0, 0,
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.EQ. IF ( IERR -1 ) THEN
1756 CALL CMUMPS_BACKSLV_RECV_AND_TREAT(
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.LT. IF ( INFO( 1 ) 0 ) THEN
1773 GOTO 270
1774 ENDIF
1775 GOTO 400
1776.EQ. ELSE IF ( IERR -2 ) THEN
1777 INFO( 1 ) = -17
1778 INFO( 2 ) = NRHS_B * LIELL * KEEP(35) + 4 * KEEP(34)
1779 GOTO 260
1780.EQ. ELSE IF ( IERR -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.EQ..AND. ALLOW_OTHERS_TO_LEAVE = ( MYLEAF_LEFT 0
1794.EQ. & KEEP(31) 0 )
1795 ENDIF
1796.NE. IF (KEEP(31) 0) THEN
1797.NOT. IF ( MUMPS_IN_OR_ROOT_SSARBR(
1798 & PROCNODE_STEPS(STEP(INODE)),
1799 & KEEP(199) ) ) THEN
1800 KEEP(31) = KEEP(31) - 1
1801.EQ. IF (KEEP(31) 1) THEN
1802 ALLOW_OTHERS_TO_LEAVE = .TRUE.
1803 ENDIF
1804 ENDIF
1805 ENDIF
1806 IF ( ALLOW_OTHERS_TO_LEAVE ) THEN
1807 CALL CMUMPS_MCAST2( DUMMY, 1, MPI_INTEGER, MYID,
1808 & COMM, TERMBWD, SLAVEF, KEEP )
1809 NBFINF = NBFINF - 1
1810 ENDIF
1811.NOT. IF ( 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
1819 CALL CMUMPS_FREETOPSO( N, KEEP(28),
1820 & IWCB, LIWW, W, LWC,
1821 & POSWCB, POSIWCB, PTRICB, PTRACB)
1822 END IF
1823.EQ. ELSE IF (MSGTAGTERREUR) THEN
1824 INFO(1) = -001
1825 INFO(2) = MSGSOU
1826 GO TO 270
1827.EQ..OR. ELSE IF ( (MSGTAGUPDATE_LOAD)
1828.EQ. & (MSGTAGTAG_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.NE. IF (NBFINF 0) THEN
1838 CALL CMUMPS_BDC_ERROR( MYID, SLAVEF, COMM, KEEP )
1839 ENDIF
1840 270 CONTINUE
1841 IF (allocated(DEJA_SEND)) DEALLOCATE(DEJA_SEND)
1842 RETURN
subroutine cmumps_get_ooc_perm_ptr(typef, nbpanels, i_pivptr, i_piv, ipos, iw, liw)
subroutine cmumps_ooc_pp_check_perm_freed(iw_location, must_be_permuted)
subroutine cmumps_permute_panel(ipiv, lpiv, ishift, the_panel, nbrow, nbcol, kbeforepanel)
subroutine cmumps_solve_gemm_update(a, la, apos1, nx, lda, ny, nrhs_b, wcb, lwcb, ptrx, ldx, ptry, ldy, mtype, keep, coef_y)
subroutine cmumps_compso(n, keep28, iwcb, liww, w, lwc, poswcb, iwposcb, ptricb, ptracb)
subroutine cmumps_sol_bwd_gthr(jbdeb, jbfin, j1, j2, rhscomp, nrhs, lrhscomp, w, ld_w, first_row_w, iw, liw, keep, n, posinrhscomp_bwd)
subroutine cmumps_solve_get_ooc_node(inode, ptrfac, keep, a, la, step, keep8, n, must_be_permuted, ierr)
subroutine cmumps_build_panel_pos(panel_size, panel_pos, len_panel_pos, indices, npiv, npanels, nfront_or_nass, nbentries_allpanels)
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)
if(complex_arithmetic) id
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 mpi_unpack(inbuf, insize, position, outbuf, outcnt, datatype, comm, ierr)
subroutine, public cmumps_buf_send_backvec(nrhs, inode, w, lw, ld_w, dest, msgtag, jbdeb, jbfin, keep, comm, ierr)
integer function, public cmumps_ooc_panel_size(nnmax)
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)