72
67
INTEGER I,K,JPERM, J, II
73
68
INTEGER IZ, NZ_THIS_BLOCK, IRHS_PTR_BEG, SHIFT_PTR
75
INTEGER LA, LIW_PASSED, LA_PASSED
70
INTEGER(8) :: LA, LA_PASSED
76
72
INTEGER LWCB_MIN, LWCB
73
INTEGER(8) :: TMP_LWCB8
77
74
INTEGER ZMUMPS_LBUF, ZMUMPS_LBUF_INT
78
75
INTEGER IBEG_ROOT_DEF, IEND_ROOT_DEF,
79
* IBEG_GLOB_DEF, IEND_GLOB_DEF,
76
& IBEG_GLOB_DEF, IEND_GLOB_DEF,
81
78
INTEGER NITREF, NOITER, SOLVET, KASE, JOBIREF
80
LOGICAL INTERLEAVE_PAR, DO_PERMUT_RHS
83
81
DOUBLE PRECISION ZERO, ONE
84
82
PARAMETER( ZERO = 0.0D0, ONE = 1.0D0 )
85
83
COMPLEX*16, DIMENSION(:), POINTER :: RHS_MUMPS
86
84
COMPLEX*16, DIMENSION(:), POINTER :: WORK_WCB
87
COMPLEX*16, ALLOCATABLE :: SAVERHS(:), RW1(:),
85
COMPLEX*16, ALLOCATABLE :: SAVERHS(:), C_RW1(:),
89
COMPLEX*16, ALLOCATABLE :: CWORK(:)
90
DOUBLE PRECISION, ALLOCATABLE :: R_RW1(:), R_Y(:), D(:)
91
DOUBLE PRECISION, ALLOCATABLE :: R_W(:)
92
DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: R_LOCWK54
93
COMPLEX*16, ALLOCATABLE, DIMENSION(:) :: C_LOCWK54
91
94
INTEGER, DIMENSION(:), ALLOCATABLE :: UNS_PERM_INV,
93
96
INTEGER LIWK_SOLVE, LIWCB
94
97
INTEGER, ALLOCATABLE :: IW1(:), IWK_SOLVE(:), IWCB(:)
95
98
INTEGER, POINTER :: N, NZ
97
100
INTEGER, POINTER :: NRHS, LRHS
98
101
DOUBLE PRECISION, DIMENSION(:), POINTER :: CNTL
99
102
INTEGER, DIMENSION (:), POINTER :: KEEP,ICNTL,INFO
266
279
LWCB_MIN = NB_K133*KEEP(133)*NBRHS
267
IF (ASSOCIATED(id%S)) THEN
280
WK_USER_PROVIDED = (id%LWK_USER.NE.0)
281
IF (id%LWK_USER.EQ.0) THEN
283
ELSE IF (id%LWK_USER.GT.0) THEN
284
ITMP8= int(id%LWK_USER,8)
286
ITMP8 = -int(id%LWK_USER,8)* 1000000_8
288
IF (KEEP(201).EQ.0) THEN
289
IF (ITMP8.NE.KEEP8(24)) THEN
291
INFO(2) = id%LWK_USER
298
IF (WK_USER_PROVIDED) THEN
300
IF (MAXS.LT. KEEP8(20)) THEN
302
ITMP8 = KEEP8(20)+1_8-MAXS
303
CALL MUMPS_731(ITMP8, INFO(2))
305
IF (INFO(1) .GE. 0 ) id%S => id%WK_USER(1:KEEP8(24))
306
ELSE IF (associated(id%S)) THEN
270
309
IF (KEEP(201).EQ.0) THEN
272
& WRITE(MP,*) ' Working array S not allocated ',
310
WRITE(*,*) ' Working array S not allocated ',
273
311
& ' on entry to solve phase (in core) '
274
312
CALL MUMPS_ABORT()
276
314
IF ( KEEP(209).EQ.-1 .AND. WORKSPACE_MINIMAL_PREFERRED)
316
MAXS = KEEP8(20) + 1_8
279
317
ELSE IF ( KEEP(209) .GE.0 ) THEN
280
MAXS = max(KEEP(209), KEEP(203) + 1)
318
MAXS = max(int(KEEP(209),8), KEEP8(20) + 1_8)
282
320
MAXS = id%KEEP8(14)
284
322
ALLOCATE (id%S(MAXS), stat = allocok)
285
324
IF ( allocok .GT. 0 ) THEN
286
325
WRITE(*,*) ' Problem allocation of S at solve'
327
CALL MUMPS_731(MAXS, INFO(2))
290
NB_BYTES = NB_BYTES + int(MAXS,8) * K35_8
331
NB_BYTES = NB_BYTES + KEEP8(23) * K35_8
291
332
NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
294
335
IF(KEEP(201).EQ.0)THEN
298
IF(MAXS.GT.(KEEP8(31)+KEEP(203)*(KEEP(107)+1)))THEN
299
LA=KEEP8(31)+KEEP(203)*(KEEP(107)+1)
339
IF(MAXS.GT.KEEP8(31)+KEEP8(20)*int(KEEP(107)+1,8))THEN
340
LA=KEEP8(31)+KEEP8(20)*int(KEEP(107)+1,8)
302
IF ( MAXS-LA .GT. LWCB_MIN ) THEN
304
WORK_WCB => id%S(LA+1:MAXS)
343
IF ( MAXS-LA .GT. int(LWCB_MIN,8) ) THEN
344
TMP_LWCB8 = min( MAXS - LA, int(huge(LWCB),8) )
345
LWCB = int( TMP_LWCB8, kind(LWCB) )
346
WORK_WCB => id%S(LA+1_8:LA+TMP_LWCB8)
305
347
WORK_WCB_ALLOCATED=.FALSE.
421
464
CALL MPI_BCAST(ICNTL10,1,MPI_INTEGER,MASTER,
423
466
CALL MPI_BCAST(ICNTL11,1,MPI_INTEGER,MASTER,
425
468
CALL MPI_BCAST(ICNTL20,1,MPI_INTEGER,MASTER,
427
470
CALL MPI_BCAST(ICNTL21,1,MPI_INTEGER,MASTER,
429
472
CALL MPI_BCAST(ERANAL,1,MPI_LOGICAL,MASTER,
431
474
CALL MPI_BCAST(LSCAL,1,MPI_LOGICAL,MASTER,
433
476
CALL MPI_BCAST(MTYPE,1,MPI_INTEGER,MASTER,
435
478
CALL MPI_BCAST(KEEP(111),1,MPI_INTEGER,MASTER,
437
id%LBUFR_BYTES = ( 4 + KEEP(133) ) * KEEP(34) +
438
* KEEP(133) * NBRHS * KEEP(35)
439
id%LBUFR = ( id%LBUFR_BYTES * KEEP(34) - 1 ) / KEEP(34)
480
id%LBUFR_BYTES = ( ( 20 + KEEP(133) ) * KEEP(34) +
481
& KEEP(133) * NBRHS * KEEP(35) )
482
TSIZE = MIN(10*id%LBUFR_BYTES, 10000000)
483
id%LBUFR_BYTES = MAX(id%LBUFR_BYTES,TSIZE)
484
id%LBUFR = ( id%LBUFR_BYTES + KEEP(34) - 1 ) / KEEP(34)
440
485
IF ( associated (id%BUFR) ) THEN
441
486
NB_BYTES = NB_BYTES - int(size(id%BUFR),8)*K34_8
442
487
DEALLOCATE(id%BUFR)
912
965
IF (ICNTL20 == 0) THEN
913
966
IF ( .NOT.I_AM_SLAVE ) THEN
914
967
CALL ZMUMPS_638(id%NSLAVES,id%N, id%MYID, id%COMM,
915
* MTYPE, RHS_MUMPS(IBEG), LD_RHS, NBRHS_EFF,
916
* JDUMMY, id%KEEP(1), id%KEEP8(1), id%PROCNODE_STEPS(1),
918
* id%STEP(1), KDUMMY, 1, BUILD_POSINRHSCOMP,
919
* id%ICNTL(1),id%INFO(1))
968
& MTYPE, RHS_MUMPS(IBEG), LD_RHS, NBRHS_EFF,
969
& JDUMMY, id%KEEP(1), id%KEEP8(1), id%PROCNODE_STEPS(1),
971
& id%STEP(1), KDUMMY, 1, BUILD_POSINRHSCOMP,
972
& id%ICNTL(1),id%INFO(1))
920
973
BUILD_POSINRHSCOMP=.FALSE.
922
975
LIW_PASSED = max( LIW, 1 )
923
976
CALL ZMUMPS_638(id%NSLAVES,id%N, id%MYID, id%COMM,
924
* MTYPE, RHS_MUMPS(IBEG), LD_RHS, NBRHS_EFF,
925
* id%PTLUST_S(1), id%KEEP(1), id%KEEP8(1),
926
* id%PROCNODE_STEPS(1),
928
* id%STEP(1), id%POSINRHSCOMP(1), KEEP(28),
929
* BUILD_POSINRHSCOMP,
930
* id%ICNTL(1),id%INFO(1))
977
& MTYPE, RHS_MUMPS(IBEG), LD_RHS, NBRHS_EFF,
978
& id%PTLUST_S(1), id%KEEP(1), id%KEEP8(1),
979
& id%PROCNODE_STEPS(1),
981
& id%STEP(1), id%POSINRHSCOMP(1), KEEP(28),
982
& BUILD_POSINRHSCOMP,
983
& id%ICNTL(1),id%INFO(1))
931
984
BUILD_POSINRHSCOMP=.FALSE.
933
986
IF (INFO(1).LT.0) GOTO 90
935
988
CALL MPI_BCAST( NZ_THIS_BLOCK,1, MPI_INTEGER,
936
* MASTER, id%COMM,IERR)
989
& MASTER, id%COMM,IERR)
937
990
IF (id%MYID==MASTER) THEN
938
991
IRHS_PTR_BEG=BEG_RHS
993
IF (associated(IRHS_SPARSE_COPY))
994
& DEALLOCATE(IRHS_SPARSE_COPY)
995
IF (associated(IRHS_SPARSE_COPY))
996
& DEALLOCATE(IRHS_SPARSE_COPY)
940
997
ALLOCATE(IRHS_SPARSE_COPY(NZ_THIS_BLOCK))
941
998
ALLOCATE(RHS_SPARSE_COPY(NZ_THIS_BLOCK))
942
999
NB_BYTES = NB_BYTES + int(NZ_THIS_BLOCK,8)*(K34_8+K35_8)
1080
1137
IF ( I_AM_SLAVE ) THEN
1081
1138
LIW_PASSED = max( LIW, 1 )
1082
LA_PASSED = max( LA, 1 )
1139
LA_PASSED = max( LA, 1_8 )
1083
1140
CALL ZMUMPS_245(id%root, N, id%S(1), LA_PASSED,
1084
* IS(1), LIW_PASSED,
1087
* RHS_MUMPS(IBEG), LD_RHS, NBRHS_EFF,
1088
* id%NA,id%LNA,id%NE_STEPS(1), SRW3, MTYPE,
1089
* ICNTL, id%STEP(1), id%FRERE_STEPS(1),
1090
* id%DAD_STEPS(1), id%FILS(1),
1091
* id%PTLUST_S(1), id%PTRFAC(1),
1092
* IWK_SOLVE, LIWK_SOLVE,
1093
* id%PROCNODE_STEPS,
1094
* id%NSLAVES, INFO, KEEP,KEEP8,
1095
* id%COMM, id%COMM_NODES, id%MYID,
1098
* id%LBUFR, id%LBUFR_BYTES,
1100
* id%ISTEP_TO_INIV2(1), id%TAB_POS_IN_PERE(1,1),
1101
* IBEG_ROOT_DEF, IEND_ROOT_DEF,
1102
* IROOT_DEF_RHS_COL1,
1103
* IPT_RHS_ROOT, SIZE_ROOT, MASTER_ROOT,
1104
* id%RHSCOMP(IBEG_RHSCOMP), LD_RHSCOMP,
1105
* id%POSINRHSCOMP(1), BUILD_POSINRHSCOMP
1141
& IS(1), LIW_PASSED,
1144
& RHS_MUMPS(IBEG), LD_RHS, NBRHS_EFF,
1145
& id%NA,id%LNA,id%NE_STEPS(1), SRW3, MTYPE,
1146
& ICNTL, id%STEP(1), id%FRERE_STEPS(1),
1147
& id%DAD_STEPS(1), id%FILS(1),
1148
& id%PTLUST_S(1), id%PTRFAC(1),
1149
& IWK_SOLVE, LIWK_SOLVE,
1150
& id%PROCNODE_STEPS,
1151
& id%NSLAVES, INFO, KEEP,KEEP8,
1152
& id%COMM, id%COMM_NODES, id%MYID,
1155
& id%LBUFR, id%LBUFR_BYTES,
1157
& id%ISTEP_TO_INIV2(1), id%TAB_POS_IN_PERE(1,1),
1158
& IBEG_ROOT_DEF, IEND_ROOT_DEF,
1159
& IROOT_DEF_RHS_COL1,
1160
& IPT_RHS_ROOT, SIZE_ROOT, MASTER_ROOT,
1161
& id%RHSCOMP(IBEG_RHSCOMP), LD_RHSCOMP,
1162
& id%POSINRHSCOMP(1), BUILD_POSINRHSCOMP
1108
1165
CALL MUMPS_276( ICNTL, INFO,
1110
1167
IF (INFO(1).eq.-2) then
1171
1228
IF (ICNTL21 == 0) THEN
1172
1229
LIW_PASSED = max( LIW, 1 )
1173
1230
IF ( .NOT.I_AM_SLAVE ) THEN
1174
CALL ZMUMPS_521(id%NSLAVES,id%N, id%MYID, id%COMM,
1175
* MTYPE, RHS_MUMPS(IBEG), LD_RHS, NBRHS_EFF,
1176
* JDUMMY, id%KEEP(1), id%KEEP8(1), id%PROCNODE_STEPS(1),
1178
* id%STEP(1), id%BUFR(1), id%LBUFR, id%LBUFR_BYTES)
1231
ALLOCATE( CWORK(KEEP(247)) )
1232
CALL ZMUMPS_521(id%NSLAVES,id%N,
1234
& MTYPE, RHS_MUMPS(IBEG), LD_RHS, NBRHS_EFF,
1235
& JDUMMY, id%KEEP(1), id%KEEP8(1), id%PROCNODE_STEPS(1),
1237
& id%STEP(1), id%BUFR(1), id%LBUFR, id%LBUFR_BYTES,
1238
& CWORK(1), KEEP(247))
1180
1241
CALL ZMUMPS_521(id%NSLAVES,id%N, id%MYID, id%COMM,
1181
* MTYPE, RHS_MUMPS(IBEG), LD_RHS, NBRHS_EFF,
1182
* id%PTLUST_S(1), id%KEEP(1), id%KEEP8(1),
1183
* id%PROCNODE_STEPS(1),
1184
* IS(1), LIW_PASSED,
1185
* id%STEP(1), id%BUFR(1), id%LBUFR, id%LBUFR_BYTES)
1242
& MTYPE, RHS_MUMPS(IBEG), LD_RHS, NBRHS_EFF,
1243
& id%PTLUST_S(1), id%KEEP(1), id%KEEP8(1),
1244
& id%PROCNODE_STEPS(1),
1245
& IS(1), LIW_PASSED,
1246
& id%STEP(1), id%BUFR(1), id%LBUFR, id%LBUFR_BYTES,
1247
& id%RHSCOMP(1), LENRHSCOMP)
1187
1249
IF ( id%MYID.eq.MASTER .AND. LSCAL ) THEN
1188
1250
IF (MTYPE .EQ. 1) THEN
1189
1251
DO K= 1, NBRHS_EFF
1190
1252
KDEC = (K-1) * LD_RHS + IBEG - 1
1192
RHS_MUMPS(KDEC+ I) = RHS_MUMPS(KDEC+ I) * id%COLSCA(I)
1254
RHS_MUMPS(KDEC+ I) = RHS_MUMPS(KDEC+ I) *
1255
& dcmplx(id%COLSCA(I))
1196
1259
DO K= 1, NBRHS_EFF
1197
1260
KDEC = (K-1) * LD_RHS + IBEG - 1
1199
RHS_MUMPS(KDEC+I) = RHS_MUMPS(KDEC+I) * id%ROWSCA(I)
1262
RHS_MUMPS(KDEC+I) = RHS_MUMPS(KDEC+I) *
1263
& dcmplx(id%ROWSCA(I))
1228
1292
IF (id%MYID .EQ. MASTER) THEN
1229
1293
GIVSOL = .FALSE.
1230
1294
IF (MP .GT. 0) WRITE( MP, 170 )
1231
ALLOCATE(RW1(N),stat=allocok)
1232
if (allocok .GT.0 ) THEN
1237
ALLOCATE(RW2(N),stat=allocok)
1238
if (allocok .GT.0 ) THEN
1243
NB_BYTES = NB_BYTES + int(2*N,8)*K35_8
1245
IF ( KEEP(54) .ne. 0 ) THEN
1246
ALLOCATE( SRW1( N ), stat =allocok )
1247
if (allocok .GT.0 ) THEN
1251
NB_BYTES = NB_BYTES + int(N,8)*K35_8
1253
NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
1295
ALLOCATE(R_RW1(N),stat=allocok)
1296
if (allocok .GT.0 ) THEN
1301
ALLOCATE(C_RW2(N),stat=allocok)
1302
IF (allocok .GT.0) THEN
1307
NB_BYTES = NB_BYTES + int(N,8)*K35_8 + int(N,8)*K16_8
1308
NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
1255
1311
CALL MUMPS_276( ICNTL, INFO,
1257
1313
IF ( INFO(1) .LT. 0 ) GOTO 90
1258
1314
IF ( KEEP(54) .eq. 0 ) THEN
1259
1315
IF (id%MYID .EQ. MASTER) THEN
1260
1316
IF (KEEP(55).EQ.0) THEN
1261
1317
CALL ZMUMPS_278( ICNTL(9), N, NZ, id%A(1),
1262
* id%IRN(1), id%JCN(1),
1263
* RHS_MUMPS(IBEG), SAVERHS, RW1, RW2, KEEP,KEEP8 )
1318
& id%IRN(1), id%JCN(1),
1319
& RHS_MUMPS(IBEG), SAVERHS, R_RW1, C_RW2, KEEP,KEEP8 )
1265
1321
CALL ZMUMPS_121( ICNTL(9), N,
1266
* id%NELT, id%ELTPTR,
1267
* id%LELTVAR, id%ELTVAR,
1268
* id%NA_ELT, id%A_ELT,
1269
* RHS_MUMPS(IBEG), SAVERHS, RW1, RW2, KEEP,KEEP8 )
1322
& id%NELT, id%ELTPTR,
1323
& id%LELTVAR, id%ELTVAR,
1324
& id%NA_ELT, id%A_ELT,
1325
& RHS_MUMPS(IBEG), SAVERHS, R_RW1, C_RW2, KEEP,KEEP8 )
1273
1329
CALL MPI_BCAST( RHS_MUMPS(IBEG), id%N,
1274
* MPI_DOUBLE_COMPLEX, MASTER,
1330
& MPI_DOUBLE_COMPLEX, MASTER,
1332
ALLOCATE( C_LOCWK54( N ), stat =allocok )
1333
if (allocok .GT.0 ) THEN
1337
CALL MUMPS_276(ICNTL, INFO, id%COMM, id%MYID)
1338
IF ( INFO(1) .LT. 0 ) GOTO 90
1339
NB_BYTES = NB_BYTES + int(N,8)*K35_8
1340
NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
1276
1341
IF ( I_AM_SLAVE .and.
1277
* id%NZ_loc .NE. 0 ) THEN
1342
& id%NZ_loc .NE. 0 ) THEN
1278
1343
CALL ZMUMPS_192( id%N, id%NZ_loc,
1279
* id%IRN_loc, id%JCN_loc, id%A_loc,
1280
* RHS_MUMPS(IBEG), SRW1, KEEP(50), MTYPE )
1344
& id%IRN_loc, id%JCN_loc, id%A_loc,
1345
& RHS_MUMPS(IBEG), C_LOCWK54, KEEP(50), MTYPE )
1347
C_LOCWK54 = dcmplx(ZERO)
1284
1349
IF ( id%MYID .eq. MASTER ) THEN
1285
CALL MPI_REDUCE( SRW1, RW2,
1286
* id%N, MPI_DOUBLE_COMPLEX,
1287
* MPI_SUM,MASTER,id%COMM, IERR)
1350
CALL MPI_REDUCE( C_LOCWK54, C_RW2,
1351
& id%N, MPI_DOUBLE_COMPLEX,
1352
& MPI_SUM,MASTER,id%COMM, IERR)
1353
C_RW2 = SAVERHS - C_RW2
1290
CALL MPI_REDUCE( SRW1, DUMMY,
1291
* id%N, MPI_DOUBLE_COMPLEX,
1292
* MPI_SUM,MASTER,id%COMM, IERR)
1355
CALL MPI_REDUCE( C_LOCWK54, C_DUMMY,
1356
& id%N, MPI_DOUBLE_COMPLEX,
1357
& MPI_SUM,MASTER,id%COMM, IERR)
1294
IF ( I_AM_SLAVE .and.
1295
* id%NZ_loc .NE. 0 ) THEN
1359
NB_BYTES = NB_BYTES - int(size(C_LOCWK54),8)*K35_8
1360
DEALLOCATE( C_LOCWK54 )
1361
ALLOCATE( R_LOCWK54( N ), stat =allocok )
1362
if (allocok .GT.0 ) THEN
1366
CALL MUMPS_276(ICNTL, INFO, id%COMM, id%MYID)
1367
IF ( INFO(1) .LT. 0 ) GOTO 90
1368
NB_BYTES = NB_BYTES + int(N,8)*K16_8
1369
NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
1370
IF ( I_AM_SLAVE .AND. id%NZ_loc .NE. 0 ) THEN
1296
1371
CALL ZMUMPS_207(id%A_loc,
1298
* id%IRN_loc, id%JCN_loc,
1299
* SRW1, id%KEEP,id%KEEP8 )
1373
& id%IRN_loc, id%JCN_loc,
1374
& R_LOCWK54, id%KEEP,id%KEEP8)
1303
1378
IF ( id%MYID .eq. MASTER ) THEN
1304
CALL MPI_REDUCE( SRW1, RW1,
1305
* id%N, MPI_DOUBLE_COMPLEX,
1306
* MPI_SUM,MASTER,id%COMM, IERR)
1379
CALL MPI_REDUCE( R_LOCWK54, R_RW1,
1380
& id%N, MPI_DOUBLE_PRECISION,
1381
& MPI_SUM,MASTER,id%COMM, IERR)
1308
CALL MPI_REDUCE( SRW1, DUMMY,
1309
* id%N, MPI_DOUBLE_COMPLEX,
1310
* MPI_SUM,MASTER,id%COMM, IERR)
1383
CALL MPI_REDUCE( R_LOCWK54, R_DUMMY,
1384
& id%N, MPI_DOUBLE_PRECISION,
1385
& MPI_SUM,MASTER,id%COMM, IERR)
1312
NB_BYTES = NB_BYTES - int(size(SRW1),8)*K35_8
1387
NB_BYTES = NB_BYTES - int(size(R_LOCWK54),8)*K16_8
1388
DEALLOCATE( R_LOCWK54 )
1315
1390
IF ( id%MYID .EQ. MASTER ) THEN
1316
1391
CALL ZMUMPS_205(ICNTL(9),INFO(1),N,NZ,
1317
* RHS_MUMPS(IBEG), SAVERHS,RW1,RW2,GIVSOL,
1318
* RSOL,RINFOG(4),RINFOG(5),RINFOG(6),MP,ICNTL,
1320
NB_BYTES = NB_BYTES - int(size(RW1),8)*K35_8
1321
& - int(size(RW2),8)*K35_8
1392
& RHS_MUMPS(IBEG), SAVERHS,R_RW1,C_RW2,GIVSOL,
1393
& RSOL,RINFOG(4),RINFOG(5),RINFOG(6),MP,ICNTL,
1395
NB_BYTES = NB_BYTES - int(size(R_RW1),8)*K16_8
1396
& - int(size(C_RW2),8)*K35_8
1326
1401
IF ( PROK .AND. ICNTL10 .GT. 0 ) WRITE( MP, 270 )
1327
1402
IF ( PROKG .AND. ICNTL10 .GT. 0 ) WRITE( MPG, 270 )
1328
ALLOCATE(Y(N), stat = allocok)
1403
ALLOCATE(R_Y(N), stat = allocok)
1404
IF ( allocok .GT. 0 ) THEN
1409
NB_BYTES = NB_BYTES + int(N,8)*K16_8
1410
ALLOCATE(C_Y(N), stat = allocok)
1329
1411
IF ( allocok .GT. 0 ) THEN
1349
1431
NB_BYTES = NB_BYTES + int(N,8)*K35_8
1350
ALLOCATE( W(3*N), stat = allocok )
1351
IF ( allocok .GT. 0 ) THEN
1356
NB_BYTES = NB_BYTES + int(3*N,8)*K35_8
1432
ALLOCATE( C_W(N), stat = allocok )
1433
IF ( allocok .GT. 0 ) THEN
1438
NB_BYTES = NB_BYTES + int(N,8)*K35_8
1439
ALLOCATE( R_W(2*N), stat = allocok )
1440
IF ( allocok .GT. 0 ) THEN
1445
NB_BYTES = NB_BYTES + int(2*N,8)*K16_8
1357
1446
NITREF = ICNTL10
1358
1447
JOBIREF= ICNTL11
1359
1448
IF ( PROKG .AND. ICNTL10 .GT. 0 )
1360
* WRITE( MPG, 240) 'MAXIMUM NUMBER OF STEPS =', NITREF
1449
& WRITE( MPG, 240) 'MAXIMUM NUMBER OF STEPS =', NITREF
1362
D( I ) = dcmplx(ONE)
1365
ALLOCATE(SRW1(N),stat = allocok)
1454
ALLOCATE(C_LOCWK54(N),stat = allocok)
1366
1455
IF ( allocok .GT. 0 ) THEN
1371
1460
NB_BYTES = NB_BYTES + int(N,8)*K35_8
1372
NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
1461
ALLOCATE(R_LOCWK54(N),stat = allocok)
1462
IF ( allocok .GT. 0 ) THEN
1467
NB_BYTES = NB_BYTES + int(N,8)*K16_8
1470
NB_BYTES_MAX = max(NB_BYTES_MAX,NB_BYTES)
1375
1471
CALL MUMPS_276( ICNTL, INFO,
1377
1473
IF ( INFO(1) .LT. 0 ) GOTO 90
1379
1475
IF ( KEEP(54) .eq. 0 ) THEN
1400
1496
IF ( KASE .eq. 0 ) THEN
1401
1497
IF ( I_AM_SLAVE .and.
1402
* id%NZ_loc .NE. 0 ) THEN
1498
& id%NZ_loc .NE. 0 ) THEN
1403
1499
IF ( MTYPE .eq. 1 ) THEN
1404
1500
CALL ZMUMPS_207(id%A_loc,
1406
* id%IRN_loc, id%JCN_loc,
1407
* SRW1, id%KEEP,id%KEEP8 )
1502
& id%IRN_loc, id%JCN_loc,
1503
& R_LOCWK54, id%KEEP,id%KEEP8 )
1409
1505
CALL ZMUMPS_207(id%A_loc,
1411
* id%JCN_loc, id%IRN_loc,
1412
* SRW1, id%KEEP,id%KEEP8 )
1507
& id%JCN_loc, id%IRN_loc,
1508
& R_LOCWK54, id%KEEP,id%KEEP8 )
1417
1513
IF ( id%MYID .eq. MASTER ) THEN
1418
CALL MPI_REDUCE( SRW1, W( N + 1 ),
1419
* id%N, MPI_DOUBLE_COMPLEX,
1420
* MPI_SUM,MASTER,id%COMM, IERR)
1514
CALL MPI_REDUCE( R_LOCWK54, R_W( N + 1 ),
1515
& id%N, MPI_DOUBLE_PRECISION,
1516
& MPI_SUM,MASTER,id%COMM, IERR)
1422
CALL MPI_REDUCE( SRW1, DUMMY,
1423
* id%N, MPI_DOUBLE_COMPLEX,
1424
* MPI_SUM,MASTER,id%COMM, IERR)
1518
CALL MPI_REDUCE( R_LOCWK54, R_DUMMY,
1519
& id%N, MPI_DOUBLE_PRECISION,
1520
& MPI_SUM,MASTER,id%COMM, IERR)
1431
1527
ARRET = sqrt(epsilon(0.0D0))
1433
1529
CALL ZMUMPS_206(NZ,N,SAVERHS,RHS_MUMPS(IBEG),
1435
* IW1, KASE,RINFOG(7),
1436
* RINFOG(9), JOBIREF, RINFOG(10), NITREF, NOITER, MP,
1437
* KEEP,KEEP8, ARRET )
1531
& IW1, KASE,RINFOG(7),
1532
& RINFOG(9), JOBIREF, RINFOG(10), NITREF, NOITER, MP,
1533
& KEEP,KEEP8, ARRET )
1439
1535
IF ( KEEP(54) .ne. 0 ) THEN
1440
1536
CALL MPI_BCAST( KASE, 1, MPI_INTEGER, MASTER,
1443
1539
IF ( KEEP(54) .eq. 0 ) THEN
1444
1540
IF ( id%MYID .eq. MASTER ) THEN
1445
1541
IF ( KASE .eq. 14 ) THEN
1446
1542
IF (KEEP(55).NE.0) THEN
1447
1543
CALL ZMUMPS_122( MTYPE, N,
1448
* id%NELT, id%ELTPTR, id%LELTVAR,
1449
* id%ELTVAR, id%NA_ELT, id%A_ELT,
1450
* SAVERHS, RHS_MUMPS(IBEG),
1544
& id%NELT, id%ELTPTR, id%LELTVAR,
1545
& id%ELTVAR, id%NA_ELT, id%A_ELT,
1546
& SAVERHS, RHS_MUMPS(IBEG),
1547
& C_Y, R_W, KEEP(50))
1453
1549
IF ( MTYPE .eq. 1 ) THEN
1454
1550
CALL ZMUMPS_208
1455
* (id%A(1), NZ, N, id%IRN(1), id%JCN(1), SAVERHS,
1456
* RHS_MUMPS(IBEG), Y, W, KEEP,KEEP8)
1551
& (id%A(1), NZ, N, id%IRN(1), id%JCN(1), SAVERHS,
1552
& RHS_MUMPS(IBEG), C_Y, R_W, KEEP,KEEP8)
1458
1554
CALL ZMUMPS_208
1459
* (id%A(1), NZ, N, id%JCN(1), id%IRN(1), SAVERHS,
1460
* RHS_MUMPS(IBEG), Y, W, KEEP,KEEP8)
1555
& (id%A(1), NZ, N, id%JCN(1), id%IRN(1), SAVERHS,
1556
& RHS_MUMPS(IBEG), C_Y, R_W, KEEP,KEEP8)
1467
1563
IF ( KASE.eq.14 ) THEN
1468
1564
CALL MPI_BCAST( RHS_MUMPS(IBEG), id%N,
1469
* MPI_DOUBLE_COMPLEX, MASTER,
1565
& MPI_DOUBLE_COMPLEX, MASTER,
1471
1567
IF ( I_AM_SLAVE .and.
1472
* id%NZ_loc .NE. 0 ) THEN
1568
& id%NZ_loc .NE. 0 ) THEN
1473
1569
CALL ZMUMPS_192( id%N, id%NZ_loc,
1474
* id%IRN_loc, id%JCN_loc, id%A_loc,
1475
* RHS_MUMPS(IBEG), SRW1, KEEP(50), MTYPE )
1570
& id%IRN_loc, id%JCN_loc, id%A_loc,
1571
& RHS_MUMPS(IBEG), C_LOCWK54, KEEP(50), MTYPE )
1573
C_LOCWK54 = dcmplx(ZERO)
1479
1575
IF ( id%MYID .eq. MASTER ) THEN
1480
CALL MPI_REDUCE( SRW1, Y,
1481
* id%N, MPI_DOUBLE_COMPLEX,
1482
* MPI_SUM,MASTER,id%COMM, IERR)
1576
CALL MPI_REDUCE( C_LOCWK54, C_Y,
1577
& id%N, MPI_DOUBLE_COMPLEX,
1578
& MPI_SUM,MASTER,id%COMM, IERR)
1485
CALL MPI_REDUCE( SRW1, DUMMY,
1486
* id%N, MPI_DOUBLE_COMPLEX,
1487
* MPI_SUM,MASTER,id%COMM, IERR)
1581
CALL MPI_REDUCE( C_LOCWK54, C_DUMMY,
1582
& id%N, MPI_DOUBLE_COMPLEX,
1583
& MPI_SUM,MASTER,id%COMM, IERR)
1489
1585
IF ( I_AM_SLAVE .and. id%NZ_loc .NE. 0 ) THEN
1490
1586
CALL ZMUMPS_193( id%N, id%NZ_loc,
1491
* id%IRN_loc, id%JCN_loc, id%A_loc,
1492
* RHS_MUMPS(IBEG), SRW1, KEEP(50), MTYPE )
1587
& id%IRN_loc, id%JCN_loc, id%A_loc,
1588
& RHS_MUMPS(IBEG), R_LOCWK54, KEEP(50), MTYPE )
1496
1592
IF ( id%MYID .eq. MASTER ) THEN
1497
CALL MPI_REDUCE( SRW1, W,
1498
* id%N, MPI_DOUBLE_COMPLEX,
1499
* MPI_SUM,MASTER,id%COMM, IERR)
1593
CALL MPI_REDUCE( R_LOCWK54, R_W,
1594
& id%N, MPI_DOUBLE_PRECISION,
1595
& MPI_SUM,MASTER,id%COMM, IERR)
1501
CALL MPI_REDUCE( SRW1, DUMMY,
1502
* id%N, MPI_DOUBLE_COMPLEX,
1503
* MPI_SUM,MASTER,id%COMM, IERR)
1597
CALL MPI_REDUCE( R_LOCWK54, R_DUMMY,
1598
& id%N, MPI_DOUBLE_PRECISION,
1599
& MPI_SUM, MASTER, id%COMM, IERR)
1540
1636
IF ( I_AM_SLAVE ) THEN
1541
1637
LIW_PASSED = max( LIW, 1 )
1542
LA_PASSED = max( LA, 1 )
1638
LA_PASSED = max( LA, 1_8 )
1543
1639
CALL ZMUMPS_245( id%root, N,
1544
* id%S(1), LA_PASSED, id%IS( 1 ),
1545
* LIW_PASSED, WORK_WCB, LWCB,
1547
* Y, N, NBRHS_EFF, id%NA, id%LNA, id%NE_STEPS,
1548
* SRW1, SOLVET, ICNTL,
1549
* id%STEP(1), id%FRERE_STEPS(1), id%DAD_STEPS(1),
1551
* id%PTLUST_S(1), id%PTRFAC(1),
1552
* IWK_SOLVE, LIWK_SOLVE,
1553
* id%PROCNODE_STEPS, id%NSLAVES, INFO, KEEP,KEEP8,
1556
* id%MYID, id%MYID_NODES,
1557
* id%BUFR, id%LBUFR, id%LBUFR_BYTES ,
1559
* id%ISTEP_TO_INIV2(1), id%TAB_POS_IN_PERE(1,1),
1560
* IBEG_ROOT_DEF, IEND_ROOT_DEF,
1561
* IROOT_DEF_RHS_COL1,
1562
* IPT_RHS_ROOT, SIZE_ROOT, MASTER_ROOT,
1563
* id%RHSCOMP(IBEG_RHSCOMP), LD_RHSCOMP,
1564
* id%POSINRHSCOMP(1), BUILD_POSINRHSCOMP )
1640
& id%S(1), LA_PASSED, id%IS( 1 ),
1641
& LIW_PASSED, WORK_WCB, LWCB,
1643
& C_Y, N, NBRHS_EFF, id%NA, id%LNA, id%NE_STEPS(1),
1644
& SRW3, SOLVET, ICNTL,
1645
& id%STEP(1), id%FRERE_STEPS(1), id%DAD_STEPS(1),
1647
& id%PTLUST_S(1), id%PTRFAC(1),
1648
& IWK_SOLVE, LIWK_SOLVE,
1649
& id%PROCNODE_STEPS, id%NSLAVES, INFO, KEEP,KEEP8,
1652
& id%MYID, id%MYID_NODES,
1653
& id%BUFR, id%LBUFR, id%LBUFR_BYTES ,
1655
& id%ISTEP_TO_INIV2(1), id%TAB_POS_IN_PERE(1,1),
1656
& IBEG_ROOT_DEF, IEND_ROOT_DEF,
1657
& IROOT_DEF_RHS_COL1,
1658
& IPT_RHS_ROOT, SIZE_ROOT, MASTER_ROOT,
1659
& id%RHSCOMP(IBEG_RHSCOMP), LD_RHSCOMP,
1660
& id%POSINRHSCOMP(1), BUILD_POSINRHSCOMP
1566
1663
CALL MUMPS_276( ICNTL, INFO,
1568
1665
IF (INFO(1).eq.-2) INFO(1)=-12
1569
1666
IF (INFO(1).eq.-3) INFO(1)=-15
1570
1667
IF (INFO(1).LT.0) GO TO 90
1571
1668
LIW_PASSED = max( LIW, 1 )
1572
1669
IF ( .NOT. I_AM_SLAVE ) THEN
1573
CALL ZMUMPS_521(id%NSLAVES,id%N, id%MYID, id%COMM,
1574
* MTYPE, Y, LD_RHS, NBRHS_EFF,
1575
* JDUMMY, id%KEEP(1),id%KEEP8(1), id%PROCNODE_STEPS(1),
1577
* id%STEP(1), id%BUFR(1), id%LBUFR, id%LBUFR_BYTES)
1670
ALLOCATE( CWORK(KEEP(247)) )
1671
CALL ZMUMPS_521(id%NSLAVES,id%N,
1673
& MTYPE, C_Y, LD_RHS, NBRHS_EFF,
1674
& JDUMMY, id%KEEP(1),id%KEEP8(1), id%PROCNODE_STEPS(1),
1676
& id%STEP(1), id%BUFR(1), id%LBUFR, id%LBUFR_BYTES,
1579
CALL ZMUMPS_521(id%NSLAVES,id%N, id%MYID, id%COMM,
1580
* MTYPE, Y, LD_RHS, NBRHS_EFF,
1581
* id%PTLUST_S(1), id%KEEP(1),id%KEEP8(1),
1582
* id%PROCNODE_STEPS(1),
1583
* IS(1), LIW_PASSED,
1584
* id%STEP(1), id%BUFR(1), id%LBUFR, id%LBUFR_BYTES)
1680
CALL ZMUMPS_521(id%NSLAVES,id%N,
1682
& MTYPE, C_Y, LD_RHS, NBRHS_EFF,
1683
& id%PTLUST_S(1), id%KEEP(1),id%KEEP8(1),
1684
& id%PROCNODE_STEPS(1),
1685
& IS(1), LIW_PASSED,
1686
& id%STEP(1), id%BUFR(1), id%LBUFR, id%LBUFR_BYTES,
1687
& id%RHSCOMP(1), LENRHSCOMP)
1586
1689
IF ( id%MYID.eq.MASTER) THEN
1587
1690
IF (LSCAL) THEN
1588
1691
IF (SOLVET .EQ. 1) THEN
1590
Y(K) = Y(K) * id%COLSCA(K)
1693
C_Y(K) = C_Y(K) * id%COLSCA(K)
1594
Y(K) = Y(K) * id%ROWSCA(K)
1697
C_Y(K) = C_Y(K) * id%ROWSCA(K)
1601
1704
INFO( 1 ) = INFO( 1 ) + 8
1603
1706
IF ( id%MYID .eq. MASTER ) THEN
1604
NB_BYTES = NB_BYTES - int(size(W),8)*K35_8
1707
NB_BYTES = NB_BYTES - int(size(R_W),8)*K16_8
1708
& - int(size(D ),8)*K16_8
1605
1709
& - int(size(IW1),8)*K34_8
1607
1711
DEALLOCATE(IW1)
1609
IF ( PROKG .AND. NITREF .GT. 0 .AND.
1610
*id%MYID .EQ. MASTER ) THEN
1714
IF (NITREF.GT.0) THEN
1611
1715
WRITE( MPG, 81 )
1612
1716
WRITE( MPG, 141 ) 'NUMBER OF STEPS OF ITERATIVE REFINEMENTS
1615
IF ( id%MYID .EQ. MASTER .AND. NITREF .GT. 0 ) THEN
1720
IF ( id%MYID .EQ. MASTER ) THEN
1721
IF ( NITREF .GT. 0 ) THEN
1616
1722
id%INFOG(15) = NOITER
1618
IF ( PROK .AND. NITREF .GT.0 ) WRITE( MP, 131 )
1725
IF ( PROK .AND. ICNTL10 .GT.0 ) WRITE( MP, 131 )
1619
1726
IF (ICNTL11 .GT. 0) THEN
1620
1727
IF ( KEEP(54) .eq. 0 ) THEN
1621
1728
IF (id%MYID .EQ. MASTER) THEN
1622
1729
IF (KEEP(55).EQ.0) THEN
1623
1730
CALL ZMUMPS_278( MTYPE, N, NZ, id%A(1),
1624
* id%IRN(1), id%JCN(1),
1625
* RHS_MUMPS(IBEG), SAVERHS, Y, D, KEEP,KEEP8 )
1731
& id%IRN(1), id%JCN(1),
1732
& RHS_MUMPS(IBEG), SAVERHS, R_Y, C_W, KEEP,KEEP8 )
1627
1734
CALL ZMUMPS_121( MTYPE, N,
1628
* id%NELT, id%ELTPTR,
1629
* id%LELTVAR, id%ELTVAR,
1630
* id%NA_ELT, id%A_ELT,
1631
* RHS_MUMPS(IBEG), SAVERHS, Y, D, KEEP,KEEP8 )
1735
& id%NELT, id%ELTPTR,
1736
& id%LELTVAR, id%ELTVAR,
1737
& id%NA_ELT, id%A_ELT,
1738
& RHS_MUMPS(IBEG), SAVERHS, R_Y, C_W, KEEP,KEEP8 )
1635
1742
CALL MPI_BCAST( RHS_MUMPS(IBEG), id%N,
1636
* MPI_DOUBLE_COMPLEX, MASTER,
1743
& MPI_DOUBLE_COMPLEX, MASTER,
1638
1745
IF ( I_AM_SLAVE .and.
1639
* id%NZ_loc .NE. 0 ) THEN
1746
& id%NZ_loc .NE. 0 ) THEN
1640
1747
CALL ZMUMPS_192( id%N, id%NZ_loc,
1641
* id%IRN_loc, id%JCN_loc, id%A_loc,
1642
* RHS_MUMPS(IBEG), SRW1, KEEP(50), MTYPE )
1748
& id%IRN_loc, id%JCN_loc, id%A_loc,
1749
& RHS_MUMPS(IBEG), C_LOCWK54, KEEP(50), MTYPE )
1751
C_LOCWK54 = dcmplx(ZERO)
1646
1753
IF ( id%MYID .eq. MASTER ) THEN
1647
CALL MPI_REDUCE( SRW1, D,
1648
* id%N, MPI_DOUBLE_COMPLEX,
1649
* MPI_SUM,MASTER,id%COMM, IERR)
1754
CALL MPI_REDUCE( C_LOCWK54, C_W,
1755
& id%N, MPI_DOUBLE_COMPLEX,
1756
& MPI_SUM,MASTER,id%COMM, IERR)
1652
CALL MPI_REDUCE( SRW1, DUMMY,
1653
* id%N, MPI_DOUBLE_COMPLEX,
1654
* MPI_SUM,MASTER,id%COMM, IERR)
1759
CALL MPI_REDUCE( C_LOCWK54, C_DUMMY,
1760
& id%N, MPI_DOUBLE_COMPLEX,
1761
& MPI_SUM,MASTER,id%COMM, IERR)
1656
1763
IF ( I_AM_SLAVE .and.
1657
* id%NZ_loc .NE. 0 ) THEN
1764
& id%NZ_loc .NE. 0 ) THEN
1658
1765
CALL ZMUMPS_207(id%A_loc,
1660
* id%IRN_loc, id%JCN_loc,
1661
* SRW1, id%KEEP,id%KEEP8 )
1767
& id%IRN_loc, id%JCN_loc,
1768
& R_LOCWK54, id%KEEP,id%KEEP8 )
1665
1772
IF ( id%MYID .eq. MASTER ) THEN
1666
CALL MPI_REDUCE( SRW1, Y,
1667
* id%N, MPI_DOUBLE_COMPLEX,
1668
* MPI_SUM,MASTER,id%COMM, IERR)
1773
CALL MPI_REDUCE( R_LOCWK54, R_Y,
1774
& id%N, MPI_DOUBLE_PRECISION,
1775
& MPI_SUM,MASTER,id%COMM, IERR)
1670
CALL MPI_REDUCE( SRW1, DUMMY,
1671
* id%N, MPI_DOUBLE_COMPLEX,
1672
* MPI_SUM,MASTER,id%COMM, IERR)
1777
CALL MPI_REDUCE( R_LOCWK54, R_DUMMY,
1778
& id%N, MPI_DOUBLE_PRECISION,
1779
& MPI_SUM,MASTER,id%COMM, IERR)
1675
1782
IF (id%MYID .EQ. MASTER) THEN
1676
IF ((MPG .GT. 0) .AND. (NITREF .GT. 0)) WRITE( MPG, 65 )
1677
IF ((MPG .GT. 0) .AND. (NITREF .LE. 0)) WRITE( MPG, 170 )
1783
IF ((MPG .GT. 0) .AND. (NITREF .GT. 0)) WRITE( MPG, 65 )
1784
IF ((MPG .GT. 0) .AND. (NITREF .LE. 0)) WRITE( MPG, 170 )
1678
1785
GIVSOL = .FALSE.
1679
1786
CALL ZMUMPS_205(MTYPE,INFO(1),N,NZ,RHS_MUMPS(IBEG),
1680
* SAVERHS,Y,D,GIVSOL,
1681
* RSOL,RINFOG(4),RINFOG(5),RINFOG(6),MPG,ICNTL,
1787
& SAVERHS,R_Y,C_W,GIVSOL,
1788
& RSOL,RINFOG(4),RINFOG(5),RINFOG(6),MPG,ICNTL,
1683
1790
IF ( MPG .GT. 0 ) THEN
1684
1791
WRITE( MPG, 115 )
1685
*'RINFOG(7):COMPONENTWISE SCALED RESIDUAL(W1)=', RINFOG(7)
1687
*'------(8):---------------------------- (W2)=', RINFOG(8)
1689
*'------(9):Upper bound ERROR ...............=', RINFOG(9)
1691
*'-----(10):CONDITION NUMBER (1) ............=', RINFOG(10)
1693
*'-----(11):CONDITION NUMBER (2) ............=', RINFOG(11)
1792
&'RINFOG(7):COMPONENTWISE SCALED RESIDUAL(W1)=', RINFOG(7)
1794
&'------(8):---------------------------- (W2)=', RINFOG(8)
1796
&'------(9):Upper bound ERROR ...............=', RINFOG(9)
1798
&'-----(10):CONDITION NUMBER (1) ............=', RINFOG(10)
1800
&'-----(11):CONDITION NUMBER (2) ............=', RINFOG(11)
1697
1804
IF (id%MYID == MASTER) THEN
1698
NB_BYTES = NB_BYTES - int(size(D),8)*K35_8
1805
NB_BYTES = NB_BYTES - int(size(C_W),8)*K35_8
1701
1808
NB_BYTES = NB_BYTES -
1702
& (int(size(Y),8)+int(size(SRW1),8))*K35_8
1809
& (int(size(R_Y),8)+int(size(R_LOCWK54),8))*K16_8
1810
NB_BYTES = NB_BYTES -
1811
& (int(size(C_Y),8)+int(size(C_LOCWK54),8))*K35_8
1814
DEALLOCATE(R_LOCWK54)
1815
DEALLOCATE(C_LOCWK54)
1706
1817
IF ( id%MYID .EQ. MASTER .AND. ICNTL21==0
1707
* .AND. KEEP(23) .NE. 0) THEN
1818
& .AND. KEEP(23) .NE. 0) THEN
1708
1819
IF ((KEEP(221).NE.1 .AND. ICNTL(9) .EQ. 1)
1709
* .OR. KEEP(111) .NE.0) THEN
1710
ALLOCATE( RW1( N ),stat =allocok )
1820
& .OR. KEEP(111) .NE.0) THEN
1821
ALLOCATE( C_RW1( N ),stat =allocok )
1711
1822
IF ( allocok .GT. 0 ) THEN
1879
1995
141 FORMAT(1X, A42,I4)
1880
1996
END SUBROUTINE ZMUMPS_301
1881
1997
SUBROUTINE ZMUMPS_245(root, N, A, LA, IW, LIW, W, LWC,
1882
* IWCB,LIWW,RHS,LRHS,NRHS,NA,LNA,NE_STEPS, W2,
1884
* STEP, FRERE, DAD, FILS, PTRIST, PTRFAC, IW1,LIW1,
1885
* PROCNODE_STEPS, SLAVEF,
1886
* INFO, KEEP,KEEP8, COMM, COMM_NODES, MYID,
1888
* BUFR, LBUFR, LBUFR_BYTES,
1890
* ISTEP_TO_INIV2, TAB_POS_IN_PERE,
1891
* IBEG_ROOT_DEF, IEND_ROOT_DEF,
1892
* IROOT_DEF_RHS_COL1, IPT_RHS_ROOT, SIZE_ROOT, MASTER_ROOT,
1893
* RHSCOMP, LRHSCOMP, POSINRHSCOMP, BUILD_POSINRHSCOMP
1998
& IWCB,LIWW,RHS,LRHS,NRHS,NA,LNA,NE_STEPS, W2,
2000
& STEP, FRERE, DAD, FILS, PTRIST, PTRFAC, IW1,LIW1,
2001
& PROCNODE_STEPS, SLAVEF,
2002
& INFO, KEEP,KEEP8, COMM, COMM_NODES, MYID,
2004
& BUFR, LBUFR, LBUFR_BYTES,
2006
& ISTEP_TO_INIV2, TAB_POS_IN_PERE,
2007
& IBEG_ROOT_DEF, IEND_ROOT_DEF,
2008
& IROOT_DEF_RHS_COL1, IPT_RHS_ROOT, SIZE_ROOT, MASTER_ROOT,
2009
& RHSCOMP, LRHSCOMP, POSINRHSCOMP, BUILD_POSINRHSCOMP
1897
2013
INCLUDE 'zmumps_root.h'
1899
2015
INCLUDE 'VT.inc'
1901
2017
TYPE ( ZMUMPS_ROOT_STRUC ) :: root
1902
INTEGER LA,LWC,N,LIW,MTYPE,LIW1,LIWW,LNA
2019
INTEGER LWC,N,LIW,MTYPE,LIW1,LIWW,LNA
1903
2020
INTEGER ICNTL(40),INFO(40), KEEP(500)
1904
2021
INTEGER*8 KEEP8(150)
1905
2022
INTEGER IW(LIW),IW1(LIW1),NA(LNA),NE_STEPS(KEEP(28)),IWCB(LIWW)
1906
2023
INTEGER STEP(N), FRERE(KEEP(28)), FILS(N), PTRIST(KEEP(28)),
1907
* PTRFAC(KEEP(28)), DAD(KEEP(28))
2025
INTEGER(8) :: PTRFAC(KEEP(28))
1908
2026
INTEGER LRHS, NRHS, LRHSCOMP
1909
2027
COMPLEX*16 A(LA), W(LWC), RHS(LRHS,NRHS),
1911
* RHSCOMP(LRHSCOMP,NRHS)
2029
& RHSCOMP(LRHSCOMP,NRHS)
1912
2030
INTEGER SLAVEF, COMM, COMM_NODES, MYID, MYID_NODES
1913
2031
INTEGER PROCNODE_STEPS(KEEP(28)), POSINRHSCOMP(KEEP(28))
1914
2032
INTEGER LBUFR, LBUFR_BYTES
1915
2033
INTEGER BUFR(LBUFR)
1916
2034
INTEGER ISTEP_TO_INIV2(KEEP(71)),
1917
* TAB_POS_IN_PERE(SLAVEF+2,max(1,KEEP(56)))
2035
& TAB_POS_IN_PERE(SLAVEF+2,max(1,KEEP(56)))
1918
2036
INTEGER IBEG_ROOT_DEF, IEND_ROOT_DEF, IROOT_DEF_RHS_COL1
1919
2037
INTEGER NRHS_LOC
1920
2038
INTEGER IPT_RHS_ROOT, SIZE_ROOT, MASTER_ROOT
2023
2140
CALL VTBEGIN(forw_soln,ierr)
2025
2142
CALL ZMUMPS_248(N, A(1), LA, IW(1), LIW, W(1),
2026
* LWC_LOC, RHS, LRHS, NRHS,
2027
* IW1(PTRICB), IWCB, LIWW,
2028
* RHSCOMP,LRHSCOMP,POSINRHSCOMP,BUILD_POSINRHSCOMP,
2029
* NE_STEPS, NA, LNA, STEP, FRERE,DAD,FILS,
2030
* IW1(NSTK_S),IW1(IPOOL),LPOOL,PTRIST,PTRFAC,
2033
* PROCNODE_STEPS, SLAVEF, COMM_NODES, MYID_NODES,
2034
* BUFR, LBUFR, LBUFR_BYTES,
2035
* W( IPT_RHS_ROOT ), MTYPE_LOC,
2037
* ISTEP_TO_INIV2, TAB_POS_IN_PERE
2143
& LWC_LOC, RHS, LRHS, NRHS,
2144
& IW1(PTRICB), IWCB, LIWW,
2145
& RHSCOMP,LRHSCOMP,POSINRHSCOMP,BUILD_POSINRHSCOMP,
2146
& NE_STEPS, NA, LNA, STEP, FRERE,DAD,FILS,
2147
& IW1(NSTK_S),IW1(IPOOL),LPOOL,PTRIST,PTRFAC,
2150
& PROCNODE_STEPS, SLAVEF, COMM_NODES, MYID_NODES,
2151
& BUFR, LBUFR, LBUFR_BYTES,
2152
& W( IPT_RHS_ROOT ), MTYPE_LOC,
2154
& ISTEP_TO_INIV2, TAB_POS_IN_PERE
2039
2156
BUILD_POSINRHSCOMP = .FALSE.
2040
2157
#if defined(V_T)
2041
2158
CALL VTEND(forw_soln,ierr)
2087
2204
CALL VTBEGIN(root_soln,ierr)
2089
2206
CALL DESCINIT( root%DESCB, root%TOT_ROOT_SIZE,
2090
* NRHS, root%MBLOCK, root%NBLOCK, 0, 0,
2091
* root%CNTXT_BLACS, LOCAL_M, IERR )
2207
& NRHS, root%MBLOCK, root%NBLOCK, 0, 0,
2208
& root%CNTXT_BLACS, LOCAL_M, IERR )
2092
2209
IF (IERR.NE.0) THEN
2093
2210
WRITE(*,*) 'After DESCINIT, IERR = ', IERR
2094
2211
CALL MUMPS_ABORT()
2096
2213
#if defined(null_space_old)
2097
2214
CALL ZMUMPS_352( NRHS, root%DESCRIPTOR,
2099
* root%CNTXT_BLACS, LOCAL_M, LOCAL_N,
2100
* root%MBLOCK, root%NBLOCK,
2101
* root%IPIV, root%LPIV, MASTER_ROOT, MYID_NODES,
2103
* W( IPT_RHS_ROOT ),
2104
* root%TOT_ROOT_SIZE, A( IAPOS ),
2105
* INFO(1), MTYPE, KEEP(50), KEEP(19),
2106
* root%QR_TAU, W(1), LWC_LOC, KEEP(17),
2107
* root%MAXG, root%GIND, root%GROW, root%GCOS, root%GSIN )
2216
& root%CNTXT_BLACS, LOCAL_M, LOCAL_N,
2217
& root%MBLOCK, root%NBLOCK,
2218
& root%IPIV, root%LPIV, MASTER_ROOT, MYID_NODES,
2220
& W( IPT_RHS_ROOT ),
2221
& root%TOT_ROOT_SIZE, A( IAPOS ),
2222
& INFO(1), MTYPE, KEEP(50), KEEP(19),
2223
& root%QR_TAU, W(1), LWC_LOC, KEEP(17),
2224
& root%MAXG, root%GIND, root%GROW, root%GCOS, root%GSIN )
2109
2226
CALL ZMUMPS_286( NRHS, root%DESCRIPTOR, root%DESCB,
2110
* root%CNTXT_BLACS, LOCAL_M, LOCAL_N,
2111
* root%MBLOCK, root%NBLOCK,
2112
* root%IPIV, root%LPIV, MASTER_ROOT, MYID_NODES,
2114
* W( IPT_RHS_ROOT ),
2115
* root%TOT_ROOT_SIZE, A( IAPOS ),
2116
* INFO(1), MTYPE, KEEP(50))
2227
& root%CNTXT_BLACS, LOCAL_M, LOCAL_N,
2228
& root%MBLOCK, root%NBLOCK,
2229
& root%IPIV, root%LPIV, MASTER_ROOT, MYID_NODES,
2231
& W( IPT_RHS_ROOT ),
2232
& root%TOT_ROOT_SIZE, A( IAPOS ),
2233
& INFO(1), MTYPE, KEEP(50))
2118
2235
IF(KEEP(201).NE.0)THEN
2119
2236
CALL ZMUMPS_598(KEEP(38),
2120
$ PTRFAC,KEEP(28),A,LA,.FALSE.,IERR)
2237
& PTRFAC,KEEP(28),A,LA,.FALSE.,IERR)
2121
2238
IF(IERR.LT.0)THEN
2124
2241
WRITE(*,*) '** ERROR after ZMUMPS_598 ',
2126
2243
call MUMPS_ABORT()
2132
* (KEEP(221).EQ.0) .AND.
2133
* ( MYID_NODES .eq. MUMPS_275( STEP(KEEP(38)),
2134
* PROCNODE_STEPS, SLAVEF ) )
2136
W( IPT_RHS_ROOT:IPT_RHS_ROOT+NRHS*SIZE_ROOT- 1) = 0.0D0
2249
& (KEEP(221).EQ.0) .AND.
2250
& ( MYID_NODES .eq. MUMPS_275( STEP(KEEP(38)),
2251
& PROCNODE_STEPS, SLAVEF ) )
2253
W( IPT_RHS_ROOT:IPT_RHS_ROOT+NRHS*SIZE_ROOT- 1)
2139
2257
ELSE IF ( KEEP(20) .NE. 0 ) THEN
2140
2258
IF ( MYID_NODES .eq. MUMPS_275( STEP(KEEP(20)),
2141
* PROCNODE_STEPS, SLAVEF ) ) THEN
2259
& PROCNODE_STEPS, SLAVEF ) ) THEN
2142
2260
IF (KEEP(221).EQ.0)
2143
& W( IPT_RHS_ROOT:IPT_RHS_ROOT+NRHS*SIZE_ROOT- 1) = 0.0D0
2261
& W( IPT_RHS_ROOT:IPT_RHS_ROOT+NRHS*SIZE_ROOT- 1)
2146
2265
#if defined(V_T)
2152
2271
IF (BUILD_POSINRHSCOMP) THEN
2154
2273
CALL ZMUMPS_639
2155
* (SLAVEF, N, MYID_NODES,
2157
* KEEP,KEEP8, PROCNODE_STEPS, IW, LIW, STEP,
2158
* POSINRHSCOMP, IDUMMY, LIDUMMY, DUMMY, WHAT)
2274
& (SLAVEF, N, MYID_NODES,
2276
& KEEP,KEEP8, PROCNODE_STEPS, IW, LIW, STEP,
2277
& POSINRHSCOMP, IDUMMY, LIDUMMY, DUMMY, WHAT)
2159
2278
BUILD_POSINRHSCOMP=.FALSE.
2161
2280
IF ( KEEP(201).NE.0 .AND. .NOT. DOROOT_BWD_PANEL )
2163
2282
I_WORKED_ON_ROOT = DOROOT
2164
IROOT = max(KEEP(20),keep(38))
2283
IROOT = max(KEEP(20),KEEP(38))
2165
2284
CALL ZMUMPS_584(PTRFAC,KEEP(28),MTYPE,
2166
* I_WORKED_ON_ROOT, IROOT, A, LA, IERR)
2285
& I_WORKED_ON_ROOT, IROOT, A, LA, IERR)
2168
2287
IF ( KEEP( 50 ) .eq. 0 ) THEN
2169
2288
MTYPE_LOC = MTYPE
2174
2293
CALL VTBEGIN(back_soln,ierr)
2176
2295
CALL ZMUMPS_249( N, A, LA, IW, LIW, W(1), LWC_LOC,
2178
* RHSCOMP, LRHSCOMP, POSINRHSCOMP,
2179
* IW1(PTRICB),IW1(PTRACB),IWCB,LIWW,
2180
* W2, NE_STEPS, NA, LNA, STEP, FRERE,FILS,
2181
* IW1(IPOOL),LPOOL,PTRIST,PTRFAC,MYLEAF,INFO,
2182
* PROCNODE_STEPS, SLAVEF, COMM_NODES,MYID_NODES,
2183
* BUFR, LBUFR, LBUFR_BYTES, KEEP,KEEP8,
2184
* W( IPT_RHS_ROOT ),
2186
* ISTEP_TO_INIV2, TAB_POS_IN_PERE, IW1(IPANEL_POS),
2297
& RHSCOMP, LRHSCOMP, POSINRHSCOMP,
2298
& IW1(PTRICB),IW1(PTRACB),IWCB,LIWW,
2299
& W2, NE_STEPS, NA, LNA, STEP, FRERE,FILS,
2300
& IW1(IPOOL),LPOOL,PTRIST,PTRFAC,MYLEAF,INFO,
2301
& PROCNODE_STEPS, SLAVEF, COMM_NODES,MYID_NODES,
2302
& BUFR, LBUFR, LBUFR_BYTES, KEEP,KEEP8,
2303
& W( IPT_RHS_ROOT ),
2305
& ISTEP_TO_INIV2, TAB_POS_IN_PERE, IW1(IPANEL_POS),
2188
2307
#if defined(V_T)
2189
2308
CALL VTEND(back_soln,ierr)
2207
2326
99992 FORMAT (//' LEAVING SOLVE (MPI41C) WITH')
2208
2327
END SUBROUTINE ZMUMPS_245
2209
2328
SUBROUTINE ZMUMPS_521(NSLAVES, N, MYID, COMM,
2210
* MTYPE, RHS, LRHS, NRHS, PTRIST,
2211
* KEEP,KEEP8, PROCNODE_STEPS, IW, LIW, STEP, BUFFER,
2212
* SIZE_BUF, SIZE_BUF_BYTES )
2329
& MTYPE, RHS, LRHS, NRHS, PTRIST,
2330
& KEEP,KEEP8, PROCNODE_STEPS, IW, LIW, STEP, BUFFER,
2331
& SIZE_BUF, SIZE_BUF_BYTES, CWORK, LCWORK )
2214
2333
INCLUDE 'mpif.h'
2215
2334
INCLUDE 'mumps_tags.h'
2216
2335
INTEGER NSLAVES, N, MYID, COMM, LIW, MTYPE
2336
INTEGER NRHS, LRHS, LCWORK
2218
2337
COMPLEX*16 RHS (LRHS, NRHS)
2219
2338
INTEGER KEEP(500)
2220
2339
INTEGER*8 KEEP8(150)
2340
COMPLEX*16 :: CWORK(LCWORK)
2221
2341
INTEGER PTRIST(KEEP(28)), PROCNODE_STEPS(KEEP(28))
2222
2342
INTEGER IW(LIW), STEP(N)
2223
2343
INTEGER SIZE_BUF, SIZE_BUF_BYTES
2224
INTEGER BUFFER(SIZE_BUF_BYTES)
2225
INTEGER I, J, JJ, J1, ISTEP, MASTER,
2226
* MYID_NODES, TYPE_PARAL, N2RECV
2227
INTEGER LIELL, IPOS, NPIV
2344
INTEGER BUFFER(SIZE_BUF)
2345
INTEGER I, II, J, J1, ISTEP, MASTER,
2346
& MYID_NODES, TYPE_PARAL, N2RECV
2347
INTEGER LIELL, IPOS, NPIV, MAXNPIV_estim, MAXSurf
2228
2348
INTEGER MSGSOU, STATUS(MPI_STATUS_SIZE), IERR
2229
2349
PARAMETER(MASTER=0)
2230
2350
LOGICAL I_AM_SLAVE
2231
2351
INTEGER RECORD_SIZE_P_1, SIZE1, SIZE2
2232
INTEGER POS_BUF, N2SEND, IROW
2352
INTEGER POS_BUF, N2SEND
2233
2353
INTEGER SK38, SK20
2234
COMPLEX*16 ONE_ROW(NRHS)
2354
INTEGER, PARAMETER :: FIN = -1
2355
INTEGER, PARAMETER :: yes = 1
2356
INTEGER, PARAMETER :: no = 0
2357
INTEGER, ALLOCATABLE, DIMENSION(:) :: IROWlist(:)
2235
2359
INCLUDE 'mumps_headers.h'
2236
2360
INTEGER MUMPS_275
2237
2361
EXTERNAL MUMPS_275
2238
IF (NSLAVES.EQ.1 .AND. KEEP(46).EQ.1) RETURN
2239
IF (NSLAVES.EQ.1 .AND. KEEP(46).EQ.0) THEN
2362
TYPE_PARAL = KEEP(46)
2363
I_AM_SLAVE = MYID .ne. 0 .OR. TYPE_PARAL .eq. 1
2364
IF ( TYPE_PARAL == 1 ) THEN
2369
IF (NSLAVES.EQ.1 .AND. TYPE_PARAL.EQ.1) RETURN
2370
IF (NSLAVES.EQ.1 .AND. TYPE_PARAL.EQ.0) THEN
2241
2372
IF ( MYID .EQ. 1 ) THEN
2242
2373
CALL MPI_SEND(RHS(1, J), N, MPI_DOUBLE_COMPLEX, MASTER,
2243
* GatherSol, COMM, IERR)
2374
& GatherSol, COMM, IERR)
2246
2377
CALL MPI_RECV(RHS(1, J), N, MPI_DOUBLE_COMPLEX,
2248
* GatherSol, COMM, STATUS, IERR )
2379
& GatherSol, COMM, STATUS, IERR )
2256
TYPE_PARAL = KEEP(46)
2384
MAXNPIV_estim = max(KEEP(246), KEEP(247))
2385
MAXSurf = MAXNPIV_estim*NRHS
2386
IF (LCWORK .GE. MAXSurf) THEN
2388
ELSE IF (LCWORK .GE. MAXNPIV_estim) THEN
2392
& "Internal error 2 in ZMUMPS_521:",
2393
& TYPE_PARAL, LCWORK, KEEP(247), NRHS
2396
IF (ONE_PACK .EQ. no .AND. I_AM_SLAVE) THEN
2398
& "Internal error 1 in ZMUMPS_521:",
2399
& TYPE_PARAL, LCWORK, KEEP(246),KEEP(247), NRHS
2402
IF (TYPE_PARAL .EQ. 0)
2403
&CALL MPI_BCAST(ONE_PACK, 1, MPI_INTEGER,
2404
& MASTER, COMM, IERR)
2405
IF (MYID.EQ.MASTER) THEN
2406
ALLOCATE(IROWlist(KEEP(247)))
2408
IF (NSLAVES .EQ. 1 .AND. TYPE_PARAL .EQ. 1) THEN
2412
CALL MPI_PACK_SIZE(MAXNPIV_estim+2,MPI_INTEGER, COMM,
2415
CALL MPI_PACK_SIZE(MAXSurf,MPI_DOUBLE_COMPLEX, COMM,
2417
RECORD_SIZE_P_1= SIZE1+SIZE2
2418
IF (RECORD_SIZE_P_1.GT.SIZE_BUF_BYTES) THEN
2420
& ' Internal error 3 in ZMUMPS_521 '
2421
write(6,*) MYID, ' RECORD_SIZE_P_1, SIZE_BUF_BYTES=',
2422
& RECORD_SIZE_P_1, SIZE_BUF_BYTES
2257
2428
IF (KEEP(38).NE.0) THEN
2258
2429
SK38=STEP(KEEP(38))
2315
2471
IF ( MYID .EQ. MASTER ) THEN
2316
2472
DO WHILE (N2RECV .NE. 0)
2317
2473
CALL MPI_RECV( BUFFER, SIZE_BUF_BYTES, MPI_PACKED,
2319
* GatherSol, COMM, STATUS, IERR )
2475
& GatherSol, COMM, STATUS, IERR )
2321
2477
CALL MPI_UNPACK( BUFFER,SIZE_BUF_BYTES, POS_BUF,
2322
* IROW, 1, MPI_INTEGER, COMM, IERR)
2323
DO WHILE (IROW.NE.0)
2324
CALL MPI_UNPACK(BUFFER, SIZE_BUF_BYTES, POS_BUF,
2325
* ONE_ROW, NRHS, MPI_DOUBLE_COMPLEX,
2327
RHS(IROW,1:NRHS)=ONE_ROW
2478
& NPIV, 1, MPI_INTEGER, COMM, IERR)
2479
DO WHILE (NPIV.NE.FIN)
2480
CALL MPI_UNPACK( BUFFER,SIZE_BUF_BYTES, POS_BUF,
2481
& IROWlist, NPIV, MPI_INTEGER, COMM, IERR)
2482
IF (ONE_PACK.EQ.yes) THEN
2483
CALL MPI_UNPACK(BUFFER, SIZE_BUF_BYTES, POS_BUF,
2484
& CWORK, NPIV*NRHS, MPI_DOUBLE_COMPLEX,
2489
& CWORK(I+(J-1)*NPIV)
2494
CALL MPI_UNPACK(BUFFER, SIZE_BUF_BYTES, POS_BUF,
2495
& CWORK, NPIV, MPI_DOUBLE_COMPLEX,
2498
RHS(IROWlist(I),J)=CWORK(I)
2328
2503
CALL MPI_UNPACK( BUFFER, SIZE_BUF_BYTES, POS_BUF,
2329
* IROW, 1, MPI_INTEGER, COMM, IERR)
2504
& NPIV, 1, MPI_INTEGER, COMM, IERR)
2507
DEALLOCATE(IROWlist)
2336
SUBROUTINE ZMUMPS_522(IROW, RHS_VAL)
2338
COMPLEX*16 RHS_VAL(NRHS)
2339
CALL MPI_PACK(IROW, 1, MPI_INTEGER, BUFFER,
2340
* SIZE_BUF_BYTES, POS_BUF, COMM, IERR )
2341
CALL MPI_PACK(RHS_VAL, NRHS, MPI_DOUBLE_COMPLEX,
2342
* BUFFER, SIZE_BUF_BYTES, POS_BUF, COMM,
2511
SUBROUTINE ZMUMPS_522( ONE_PACK )
2517
CWORK(II+(J-1)*NPIV) = RHS(I,J)
2520
CALL MPI_PACK(NPIV, 1, MPI_INTEGER, BUFFER,
2521
& SIZE_BUF_BYTES, POS_BUF, COMM, IERR )
2522
CALL MPI_PACK(IW(J1), NPIV, MPI_INTEGER, BUFFER,
2523
& SIZE_BUF_BYTES, POS_BUF, COMM, IERR )
2524
IF (ONE_PACK.EQ.yes) THEN
2525
CALL MPI_PACK(CWORK(1), NPIV*NRHS, MPI_DOUBLE_COMPLEX,
2526
& BUFFER, SIZE_BUF_BYTES, POS_BUF, COMM,
2531
CALL MPI_PACK(CWORK(III), NPIV, MPI_DOUBLE_COMPLEX,
2532
& BUFFER, SIZE_BUF_BYTES, POS_BUF, COMM,
2345
2538
IF ( POS_BUF + RECORD_SIZE_P_1 > SIZE_BUF_BYTES ) THEN
2346
2539
CALL ZMUMPS_523()
2731
2924
END SUBROUTINE ZMUMPS_639
2732
2925
SUBROUTINE ZMUMPS_248(N, A, LA, IW, LIW, WCB, LWCB,
2734
* PTRICB, IWCB, LIWCB,
2735
* RHSCOMP, LRHSCOMP, POSINRHSCOMP, BUILD_POSINRHSCOMP,
2736
* NE_STEPS, NA, LNA, STEP,
2738
* NSTK_S, IPOOL, LPOOL, PTRIST, PTRFAC, MYLEAF, INFO,
2741
* SLAVEF, COMM, MYID, BUFR, LBUFR, LBUFR_BYTES,
2744
* ISTEP_TO_INIV2, TAB_POS_IN_PERE
2927
& PTRICB, IWCB, LIWCB,
2928
& RHSCOMP, LRHSCOMP, POSINRHSCOMP, BUILD_POSINRHSCOMP,
2929
& NE_STEPS, NA, LNA, STEP,
2931
& NSTK_S, IPOOL, LPOOL, PTRIST, PTRFAC, MYLEAF, INFO,
2934
& SLAVEF, COMM, MYID, BUFR, LBUFR, LBUFR_BYTES,
2937
& ISTEP_TO_INIV2, TAB_POS_IN_PERE
2749
INTEGER N, LA, LIW, LWCB, LPOOL, LIWCB, LNA
2943
INTEGER N, LIW, LWCB, LPOOL, LIWCB, LNA
2750
2944
INTEGER SLAVEF, MYLEAF, COMM, MYID
2751
2945
INTEGER INFO( 40 ), KEEP(500)
2752
2946
INTEGER*8 KEEP8(150)
2838
3033
CALL ZMUMPS_302( INODE, BUFR, LBUFR, LBUFR_BYTES,
2839
* MSGTAG, MSGSOU, MYID, SLAVEF, COMM, N,
2840
* IPOOL, LPOOL, III, LEAF, NBFIN, NSTK_S,
2841
* IWCB, LIWCB, WCB, LWCB, A, LA,
2842
* IW, LIW, RHS, LRHS, NRHS,
2843
* POSWCB, PLEFTWCB, POSIWCB,
2844
* PTRICB, PTRIST, PTRFAC, PROCNODE_STEPS,
2845
* FILS, STEP, FRERE, DAD,
2846
* MYROOT, INFO, KEEP,KEEP8, RHS_ROOT, MTYPE,
2847
* RHSCOMP, LRHSCOMP, POSINRHSCOMP,
2848
* RHSCOMPFREEPOS, BUILD_POSINRHSCOMP,
2849
* ISTEP_TO_INIV2, TAB_POS_IN_PERE
3034
& MSGTAG, MSGSOU, MYID, SLAVEF, COMM, N,
3035
& IPOOL, LPOOL, III, LEAF, NBFIN, NSTK_S,
3036
& IWCB, LIWCB, WCB, LWCB, A, LA,
3037
& IW, LIW, RHS, LRHS, NRHS,
3038
& POSWCB, PLEFTWCB, POSIWCB,
3039
& PTRICB, PTRIST, PTRFAC, PROCNODE_STEPS,
3040
& FILS, STEP, FRERE, DAD,
3041
& MYROOT, INFO, KEEP,KEEP8, RHS_ROOT, MTYPE,
3042
& RHSCOMP, LRHSCOMP, POSINRHSCOMP,
3043
& RHSCOMPFREEPOS, BUILD_POSINRHSCOMP,
3044
& ISTEP_TO_INIV2, TAB_POS_IN_PERE
2851
3046
IF ( INFO( 1 ) .LT. 0 .OR. NBFIN .EQ. 0 ) GOTO 260
2854
3049
CALL ZMUMPS_150( MYID,COMM,BUFR,
2855
* LBUFR,LBUFR_BYTES )
3050
& LBUFR,LBUFR_BYTES )
2857
3052
END SUBROUTINE ZMUMPS_248
2858
3053
RECURSIVE SUBROUTINE ZMUMPS_323
2859
* ( BUFR, LBUFR, LBUFR_BYTES,
2860
* MSGTAG, MSGSOU, MYID, SLAVEF, COMM,
2861
* N, NRHS, IPOOL, LPOOL, III, LEAF,
2862
* NBFIN, NSTK_S, IW, LIW, A, LA, PTRIST,
2863
* PTRFAC, IWCB, LIWCB,
2864
* WCB, LWCB, POSWCB,
2865
* PLEFTWCB, POSIWCB,
2867
* INFO, KEEP,KEEP8, STEP, PROCNODE_STEPS,
3054
& ( BUFR, LBUFR, LBUFR_BYTES,
3055
& MSGTAG, MSGSOU, MYID, SLAVEF, COMM,
3056
& N, NRHS, IPOOL, LPOOL, III, LEAF,
3057
& NBFIN, NSTK_S, IW, LIW, A, LA, PTRIST,
3058
& PTRFAC, IWCB, LIWCB,
3059
& WCB, LWCB, POSWCB,
3060
& PLEFTWCB, POSIWCB,
3062
& INFO, KEEP,KEEP8, STEP, PROCNODE_STEPS,
2871
3066
USE ZMUMPS_COMM_BUFFER
2873
3068
INTEGER LBUFR, LBUFR_BYTES
2874
3069
INTEGER MSGTAG, MSGSOU, MYID, SLAVEF, COMM
2876
3072
INTEGER N, NRHS, LPOOL, III, LEAF, NBFIN
2877
3073
INTEGER LIWCB, LWCB, POSWCB, PLEFTWCB, POSIWCB
2878
3074
INTEGER INFO( 40 ), KEEP( 500)
2906
3104
ELSE IF (MSGTAG .EQ. ContVec ) THEN
2908
3106
CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
2909
* FINODE, 1, MPI_INTEGER, COMM, IERR )
2910
CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
2911
* FPERE, 1, MPI_INTEGER, COMM, IERR )
2912
CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
2913
* NCB, 1, MPI_INTEGER, COMM, IERR )
2914
CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
2915
* LONG, 1, MPI_INTEGER, COMM, IERR )
3107
& FINODE, 1, MPI_INTEGER, COMM, IERR )
3108
CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
3109
& FPERE, 1, MPI_INTEGER, COMM, IERR )
3110
CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
3111
& NCB, 1, MPI_INTEGER, COMM, IERR )
3112
CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
3113
& LONG, 1, MPI_INTEGER, COMM, IERR )
2916
3114
IF ( NCB .eq. 0 ) THEN
2917
3115
PTRICB(STEP(FINODE)) = -1
2918
3116
NSTK_S(STEP(FPERE)) = NSTK_S(STEP(FPERE)) - 1
2967
3165
ELSEIF ( MSGTAG .EQ. Master2Slave ) THEN
2969
3167
CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
2970
* FINODE, 1, MPI_INTEGER, COMM, IERR )
2971
CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
2972
* FPERE, 1, MPI_INTEGER, COMM, IERR )
2973
CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
2974
* NCV, 1, MPI_INTEGER, COMM, IERR )
2975
CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
2976
* NPIV, 1, MPI_INTEGER, COMM, IERR )
3168
& FINODE, 1, MPI_INTEGER, COMM, IERR )
3169
CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
3170
& FPERE, 1, MPI_INTEGER, COMM, IERR )
3171
CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
3172
& NCV, 1, MPI_INTEGER, COMM, IERR )
3173
CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
3174
& NPIV, 1, MPI_INTEGER, COMM, IERR )
2977
3175
PTRY = PLEFTWCB
2978
3176
PTRX = PLEFTWCB + NCV * NRHS
2979
3177
PLEFTWCB = PLEFTWCB + (NPIV + NCV) * NRHS
3069
3267
CALL ZMUMPS_78( NRHS, FINODE, FPERE,
3070
* IW(PTRIST(STEP( FINODE )) + 2 + KEEP(IXSZ) ), NCV,NCV,
3071
* IW(PTRIST(STEP(FINODE))+4+ KEEP(IXSZ) ),
3072
* WCB( PTRY ), PDEST, ContVec, COMM, IERR )
3268
& IW(PTRIST(STEP( FINODE )) + 2 + KEEP(IXSZ) ), NCV,NCV,
3269
& IW(PTRIST(STEP(FINODE))+4+ KEEP(IXSZ) ),
3270
& WCB( PTRY ), PDEST, ContVec, COMM, IERR )
3073
3271
IF ( IERR .EQ. -1 ) THEN
3074
3272
CALL ZMUMPS_303( .FALSE., FLAG,
3075
* BUFR, LBUFR, LBUFR_BYTES,
3076
* MYID, SLAVEF, COMM,
3077
* N, NRHS, IPOOL, LPOOL, III, LEAF,
3078
* NBFIN, NSTK_S, IW, LIW, A, LA, PTRIST, PTRFAC,
3080
* WCB, LWCB, POSWCB, PLEFTWCB, POSIWCB,
3081
* PTRICB, INFO, KEEP,KEEP8, STEP,
3273
& BUFR, LBUFR, LBUFR_BYTES,
3274
& MYID, SLAVEF, COMM,
3275
& N, NRHS, IPOOL, LPOOL, III, LEAF,
3276
& NBFIN, NSTK_S, IW, LIW, A, LA, PTRIST, PTRFAC,
3278
& WCB, LWCB, POSWCB, PLEFTWCB, POSIWCB,
3279
& PTRICB, INFO, KEEP,KEEP8, STEP,
3085
3283
IF ( INFO( 1 ) .LT. 0 ) GOTO 270
3087
3285
ELSE IF ( IERR .EQ. -2 ) THEN
3088
3286
INFO( 1 ) = -17
3089
3287
INFO( 2 ) = ( NCV + 4 ) * KEEP( 34 ) +
3092
3290
ELSE IF ( IERR .EQ. -3 ) THEN
3093
3291
INFO( 1 ) = -20
3094
3292
INFO( 2 ) = ( NCV + 4 ) * KEEP( 34 ) +
3098
3296
PLEFTWCB = PLEFTWCB - NCV * NRHS
3116
3314
END SUBROUTINE ZMUMPS_323
3117
3315
SUBROUTINE ZMUMPS_302( INODE,
3118
* BUFR, LBUFR, LBUFR_BYTES,
3119
* MSGTAG, MSGSOU, MYID, SLAVEF, COMM,
3120
* N, IPOOL, LPOOL, III, LEAF,
3123
* WCB, LWCB, A, LA, IW, LIW,
3124
* RHS, LRHS, NRHS, POSWCB,
3125
* PLEFTWCB, POSIWCB,
3126
* PTRICB, PTRIST, PTRFAC, PROCNODE_STEPS,
3127
* FILS, STEP, FRERE, DAD,
3129
* INFO, KEEP,KEEP8, RHS_ROOT, MTYPE,
3130
* RHSCOMP, LRHSCOMP, POSINRHSCOMP,
3131
* RHSCOMPFREEPOS, BUILD_POSINRHSCOMP,
3133
* ISTEP_TO_INIV2, TAB_POS_IN_PERE
3316
& BUFR, LBUFR, LBUFR_BYTES,
3317
& MSGTAG, MSGSOU, MYID, SLAVEF, COMM,
3318
& N, IPOOL, LPOOL, III, LEAF,
3321
& WCB, LWCB, A, LA, IW, LIW,
3322
& RHS, LRHS, NRHS, POSWCB,
3323
& PLEFTWCB, POSIWCB,
3324
& PTRICB, PTRIST, PTRFAC, PROCNODE_STEPS,
3325
& FILS, STEP, FRERE, DAD,
3327
& INFO, KEEP,KEEP8, RHS_ROOT, MTYPE,
3328
& RHSCOMP, LRHSCOMP, POSINRHSCOMP,
3329
& RHSCOMPFREEPOS, BUILD_POSINRHSCOMP,
3331
& ISTEP_TO_INIV2, TAB_POS_IN_PERE
3137
3335
USE ZMUMPS_COMM_BUFFER
3140
3338
INTEGER INODE, LBUFR, LBUFR_BYTES
3141
3339
INTEGER MSGTAG, MSGSOU, MYID, SLAVEF, COMM
3142
INTEGER LIWCB, LWCB, LIW, LA, POSWCB, PLEFTWCB, POSIWCB
3340
INTEGER LIWCB, LWCB, LIW, POSWCB, PLEFTWCB, POSIWCB
3143
3342
INTEGER N, LPOOL, III, LEAF, NBFIN
3145
3344
INTEGER INFO( 40 ), KEEP( 500)
3150
3349
INTEGER LRHS, NRHS
3151
3350
COMPLEX*16 WCB( LWCB ), A( LA )
3152
3351
COMPLEX*16 RHS(LRHS, NRHS ), RHS_ROOT( * )
3153
INTEGER PTRICB(KEEP(28)), PTRIST(KEEP(28)), PTRFAC(KEEP(28))
3352
INTEGER PTRICB(KEEP(28)), PTRIST(KEEP(28))
3353
INTEGER(8) :: PTRFAC(KEEP(28))
3154
3354
INTEGER PROCNODE_STEPS(KEEP(28))
3155
3355
INTEGER FILS( N ), STEP( N ), FRERE(KEEP(28)), DAD(KEEP(28))
3156
3356
INTEGER ISTEP_TO_INIV2(KEEP(71)),
3157
* TAB_POS_IN_PERE(SLAVEF+2,max(1,KEEP(56)))
3357
& TAB_POS_IN_PERE(SLAVEF+2,max(1,KEEP(56)))
3158
3358
INTEGER POSINRHSCOMP(KEEP(28)), LRHSCOMP, RHSCOMPFREEPOS
3159
3359
COMPLEX*16 RHSCOMP(LRHSCOMP, NRHS)
3160
3360
LOGICAL BUILD_POSINRHSCOMP
3161
3361
EXTERNAL ZGEMV, ZTRSV, ZGEMM, ZTRSM, MUMPS_275
3162
3362
INTEGER MUMPS_275
3163
3363
COMPLEX*16 ALPHA,ONE,ZERO
3164
PARAMETER(ONE=1.0D0, ALPHA=-1.0D0, ZERO=0.0D0)
3364
PARAMETER (ZERO=(0.0D0,0.0D0),
3365
& ONE=(1.0D0,0.0D0),
3366
& ALPHA=(-1.0D0,0.0D0))
3367
INTEGER(8) :: APOS, APOS1, APOS2, APOSOFF
3165
3368
INTEGER I, J, K, IPOS, NSLAVES, J1, J2, J3, FPERE, NPIV, NCB,
3167
* APOS, APOS1, IF, IFR, IPOSCB, APOSCB, LIELL, IN, JJ,
3168
* NELIM, PLEFT, PCB_COURANT, PPIV_COURANT
3370
& IF, IFR, IPOSCB, APOSCB, LIELL, IN, JJ,
3371
& NELIM, PLEFT, PCB_COURANT, PPIV_COURANT
3169
3372
INTEGER IPOSINRHSCOMP
3170
3373
INTEGER Effective_CB_Size, NUPDATE, ISLAVE, PDEST, FirstIndex
3172
3375
INCLUDE 'mumps_headers.h'
3173
INTEGER APOS2, APOSOFF, POSWCB1,POSWCB2, JJ1, JJ2
3174
INTEGER TempNROW, TempNCOL, TailleEcrite, PANEL_SIZE, LIWFAC,
3175
& APOSDEB, JFIN, NBJ, NUPDATE_PANEL,
3376
INTEGER POSWCB1,POSWCB2, JJ1, JJ2
3377
INTEGER(8) :: APOSDEB
3378
INTEGER TempNROW, TempNCOL, PANEL_SIZE, LIWFAC,
3379
& JFIN, NBJ, NUPDATE_PANEL,
3176
3380
& PPIV_PANEL, PCB_PANEL, NBK, TYPEF
3177
3381
INTEGER LD_WCBPIV
3178
3382
INTEGER LD_WCBCB
3179
3383
INTEGER LDAJ, LDAJ_FIRST_PANEL
3180
3384
INTEGER TMP_NBPANELS,
3181
* I_PIVRPTR, I_PIVR, IPANEL
3385
& I_PIVRPTR, I_PIVR, IPANEL
3182
3386
INTEGER INODE_STATE
3183
3387
LOGICAL MUST_BE_PERMUTED
3184
3388
INCLUDE 'mpif.h'
3201
3405
IF (KEEP(201).NE.0) THEN
3202
3406
CALL ZMUMPS_643(
3203
3407
& INODE,PTRFAC,KEEP,A,LA,STEP,
3204
$ KEEP8,N,MUST_BE_PERMUTED,IERR)
3408
& KEEP8,N,MUST_BE_PERMUTED,IERR)
3205
3409
IF(IERR.LT.0)THEN
3210
IF (KEEP(201).EQ.1) THEN
3213
& PTRIST(STEP(INODE))+IW(PTRIST(STEP(INODE))+XXI)-1
3216
MUST_BE_PERMUTED = .FALSE.
3414
IF (KEEP(201).EQ.1 .AND. KEEP(50).NE.1) THEN
3416
& IW(IPOS+1+2*LIELL+1+NSLAVES),
3417
& MUST_BE_PERMUTED )
3220
APOS = PTRFAC(IW(IPOS))
3221
IF (KEEP(201).EQ.1) THEN
3222
IF (MTYPE.EQ.1) THEN
3223
IF ((MTYPE.EQ.1).AND.NSLAVES.NE.0) THEN
3224
TempNROW= NPIV+NELIM
3226
LDAJ_FIRST_PANEL=TempNROW
3230
LDAJ_FIRST_PANEL=TempNROW
3236
LDAJ_FIRST_PANEL=TempNCOL
3239
IF (INODE.eq.KEEP(38).OR.INODE.eq.KEEP(20)) THEN
3240
WRITE(6,*) ' FWD Special case of ROOT to be checked '
3241
LIWFAC = IW(PTRIST(STEP(INODE))+XXI)
3243
CALL ZMUMPS_690( INODE, TYPEF,
3244
& IW(PTRIST(STEP(INODE))), LIWFAC, TempNROW,
3245
& PANEL_SIZE, TailleEcrite)
3246
PANEL_SIZE = TailleEcrite
3248
LIWFAC = IW(PTRIST(STEP(INODE))+XXI)
3249
CALL ZMUMPS_690( INODE, TYPEF,
3250
& IW(PTRIST(STEP(INODE))), LIWFAC, LDAJ_FIRST_PANEL,
3251
& PANEL_SIZE, TailleEcrite)
3253
IF (PANEL_SIZE.LT.0) THEN
3254
WRITE(6,*) ' Internal error in fwd solve PANEL_SIZE=',
3259
NSLAVES = IW( PTRIST(STEP(INODE)) + 5 + KEEP(IXSZ))
3260
IPOS = IPOS + 1 + NSLAVES
3420
NSLAVES = IW( PTRIST(STEP(INODE)) + 5 + KEEP(IXSZ))
3421
IPOS = IPOS + 1 + NSLAVES
3262
3423
IF ( MTYPE .EQ. 1 .OR. KEEP(50) .NE. 0 ) THEN
3360
3543
LDAJ = LDAJ_FIRST_PANEL-J+1
3361
3544
IF ( (KEEP(50).NE.1).AND. MUST_BE_PERMUTED ) THEN
3362
3545
CALL ZMUMPS_667(TYPEF, TMP_NBPANELS,
3363
* I_PIVRPTR, I_PIVR, IPOS+1+2*LIELL, IW, LIW)
3546
& I_PIVRPTR, I_PIVR, IPOS+1+2*LIELL, IW, LIW)
3364
3547
IF (NPIV.EQ.(IW(I_PIVRPTR+IPANEL-1)-1)) THEN
3365
3548
MUST_BE_PERMUTED=.FALSE.
3367
3550
CALL ZMUMPS_698(
3368
* IW( I_PIVR+ IW(I_PIVRPTR+IPANEL-1)-
3370
* NPIV-IW(I_PIVRPTR+IPANEL-1)+1,
3371
* IW(I_PIVRPTR+IPANEL-1)-1,
3551
& IW( I_PIVR+ IW(I_PIVRPTR+IPANEL-1)-
3553
& NPIV-IW(I_PIVRPTR+IPANEL-1)+1,
3554
& IW(I_PIVRPTR+IPANEL-1)-1,
3377
3560
NUPDATE_PANEL = LDAJ - NBJ
3378
3561
PPIV_PANEL = PPIV_COURANT+J-1
3379
3562
PCB_PANEL = PPIV_PANEL+NBJ
3563
APOS1 = APOSDEB+int(NBJ,8)
3381
3564
IF (MTYPE.EQ.1) THEN
3382
3565
IF ( NRHS == 1 ) THEN
3383
3566
CALL ZTRSV( 'L', 'N', 'U', NBJ, A(APOSDEB), LDAJ,
3384
* WCB(PPIV_PANEL), 1 )
3567
& WCB(PPIV_PANEL), 1 )
3385
3568
IF (NUPDATE_PANEL.GT.0) THEN
3386
3569
CALL ZGEMV('N', NUPDATE_PANEL,NBJ,ALPHA, A(APOS1),
3387
* LDAJ, WCB(PPIV_PANEL), 1, ONE,
3388
* WCB(PCB_PANEL), 1)
3570
& LDAJ, WCB(PPIV_PANEL), 1, ONE,
3571
& WCB(PCB_PANEL), 1)
3391
3574
CALL ZTRSM( 'L','L','N','U', NBJ, NRHS, ONE,
3392
* A(APOSDEB), LDAJ, WCB(PPIV_PANEL),
3575
& A(APOSDEB), LDAJ, WCB(PPIV_PANEL),
3394
3577
IF (NUPDATE_PANEL.GT.0) THEN
3395
3578
CALL ZGEMM('N', 'N', NUPDATE_PANEL, NRHS, NBJ,
3397
* A(APOS1), LDAJ, WCB(PPIV_PANEL), LIELL, ONE,
3398
* WCB(PCB_PANEL), LIELL)
3580
& A(APOS1), LDAJ, WCB(PPIV_PANEL), LIELL, ONE,
3581
& WCB(PCB_PANEL), LIELL)
3402
3585
IF (NRHS == 1) THEN
3403
3586
CALL ZTRSV( 'L', 'N', 'N', NBJ, A(APOSDEB), LDAJ,
3404
* WCB(PPIV_PANEL), 1 )
3587
& WCB(PPIV_PANEL), 1 )
3405
3588
IF (NUPDATE_PANEL.GT.0) THEN
3406
3589
CALL ZGEMV('N',NUPDATE_PANEL, NBJ, ALPHA, A(APOS1),
3407
* LDAJ, WCB(PPIV_PANEL), 1,
3408
* ONE, WCB(PCB_PANEL), 1 )
3590
& LDAJ, WCB(PPIV_PANEL), 1,
3591
& ONE, WCB(PCB_PANEL), 1 )
3411
3594
CALL ZTRSM('L','L','N','N',NBJ, NRHS, ONE,
3412
* A(APOSDEB), LDAJ, WCB(PPIV_PANEL),
3595
& A(APOSDEB), LDAJ, WCB(PPIV_PANEL),
3414
3597
IF (NUPDATE_PANEL.GT.0) THEN
3415
3598
CALL ZGEMM('N', 'N', NUPDATE_PANEL, NRHS, NBJ,
3417
* A(APOS1), LDAJ, WCB(PPIV_PANEL), LIELL, ONE,
3418
* WCB(PCB_PANEL), LIELL)
3600
& A(APOS1), LDAJ, WCB(PPIV_PANEL), LIELL, ONE,
3601
& WCB(PCB_PANEL), LIELL)
3422
APOSDEB = APOSDEB+LDAJ*NBJ
3605
APOSDEB = APOSDEB+int(LDAJ,8)*int(NBJ,8)
3424
3607
IF ( J .LE. NPIV ) GOTO 10
3426
3609
IF (KEEP(50).NE.0) THEN
3427
3610
IF ( NRHS == 1 ) THEN
3428
3611
CALL ZTRSV( 'U', 'T', 'U', NPIV, A(APOS), NPIV,
3429
* WCB(PPIV_COURANT), 1 )
3612
& WCB(PPIV_COURANT), 1 )
3431
3614
CALL ZTRSM( 'L','U','T','U', NPIV, NRHS, ONE,
3432
* A(APOS), NPIV, WCB(PPIV_COURANT),
3615
& A(APOS), NPIV, WCB(PPIV_COURANT),
3436
3619
IF ( MTYPE .eq. 1 ) THEN
3437
3620
IF ( NRHS == 1) THEN
3438
3621
CALL ZTRSV( 'U', 'T', 'U', NPIV, A(APOS), LIELL,
3439
* WCB(PPIV_COURANT), 1 )
3622
& WCB(PPIV_COURANT), 1 )
3441
3624
CALL ZTRSM( 'L','U','T','U', NPIV, NRHS, ONE,
3442
* A(APOS), LIELL, WCB(PPIV_COURANT),
3625
& A(APOS), LIELL, WCB(PPIV_COURANT),
3446
3629
IF (NRHS == 1) THEN
3447
3630
CALL ZTRSV( 'L', 'N', 'N', NPIV, A(APOS), LIELL,
3448
* WCB(PPIV_COURANT), 1 )
3631
& WCB(PPIV_COURANT), 1 )
3450
3633
CALL ZTRSM('L','L','N','N',NPIV, NRHS, ONE,
3451
* A(APOS), LIELL, WCB(PPIV_COURANT),
3634
& A(APOS), LIELL, WCB(PPIV_COURANT),
3476
3659
IF ( MTYPE .eq. 1 ) THEN
3477
3660
IF ( NRHS == 1 ) THEN
3478
3661
CALL ZGEMV('T', NPIV, NUPDATE, ALPHA, A(APOS1),
3479
* NPIV, WCB(PPIV_COURANT), 1, ONE,
3480
* WCB(PCB_COURANT), 1)
3662
& NPIV, WCB(PPIV_COURANT), 1, ONE,
3663
& WCB(PCB_COURANT), 1)
3482
3665
CALL ZGEMM('T', 'N', NUPDATE, NRHS, NPIV, ALPHA,
3483
* A(APOS1), NPIV, WCB(PPIV_COURANT), NPIV, ONE,
3484
* WCB(PCB_COURANT), NCB)
3666
& A(APOS1), NPIV, WCB(PPIV_COURANT), NPIV, ONE,
3667
& WCB(PCB_COURANT), NCB)
3487
3670
IF ( NRHS == 1 ) THEN
3488
3671
CALL ZGEMV('N',NUPDATE, NPIV, ALPHA, A(APOS1),
3489
* LIELL, WCB(PPIV_COURANT), 1,
3490
* ONE, WCB(PCB_COURANT), 1 )
3672
& LIELL, WCB(PPIV_COURANT), 1,
3673
& ONE, WCB(PCB_COURANT), 1 )
3492
3675
CALL ZGEMM('N', 'N', NUPDATE, NRHS, NPIV, ALPHA,
3493
* A(APOS1), LIELL, WCB(PPIV_COURANT), NPIV, ONE,
3494
* WCB(PCB_COURANT), NCB)
3676
& A(APOS1), LIELL, WCB(PPIV_COURANT), NPIV, ONE,
3677
& WCB(PCB_COURANT), NCB)
3623
3806
CALL ZMUMPS_78( NRHS, INODE, FPERE, NCB, LD_WCBCB,
3625
* IW( J3 + 1 ), WCB( PCB_COURANT ),
3626
* MUMPS_275(STEP(FPERE),
3627
* PROCNODE_STEPS,SLAVEF),
3808
& IW( J3 + 1 ), WCB( PCB_COURANT ),
3809
& MUMPS_275(STEP(FPERE),
3810
& PROCNODE_STEPS,SLAVEF),
3630
3813
IF ( IERR .EQ. -1 ) THEN
3631
3814
CALL ZMUMPS_303( .FALSE., FLAG,
3632
* BUFR, LBUFR, LBUFR_BYTES,
3633
* MYID, SLAVEF, COMM,
3634
* N, NRHS, IPOOL, LPOOL, III, LEAF,
3635
* NBFIN, NSTK_S, IW, LIW, A, LA, PTRIST, PTRFAC,
3637
* WCB, LWCB, POSWCB, PLEFTWCB, POSIWCB,
3638
* PTRICB, INFO, KEEP,KEEP8, STEP,
3815
& BUFR, LBUFR, LBUFR_BYTES,
3816
& MYID, SLAVEF, COMM,
3817
& N, NRHS, IPOOL, LPOOL, III, LEAF,
3818
& NBFIN, NSTK_S, IW, LIW, A, LA, PTRIST, PTRFAC,
3820
& WCB, LWCB, POSWCB, PLEFTWCB, POSIWCB,
3821
& PTRICB, INFO, KEEP,KEEP8, STEP,
3642
3825
IF ( INFO( 1 ) .LT. 0 ) GOTO 270
3644
3827
ELSE IF ( IERR .EQ. -2 ) THEN
3645
3828
INFO( 1 ) = -17
3646
3829
INFO( 2 ) = NUPDATE * KEEP( 35 ) +
3647
* ( NUPDATE + 3 ) * KEEP( 34 )
3830
& ( NUPDATE + 3 ) * KEEP( 34 )
3649
3832
ELSE IF ( IERR .EQ. -3 ) THEN
3650
3833
INFO( 1 ) = -20
3651
3834
INFO( 2 ) = NUPDATE * KEEP( 35 ) +
3652
* ( NUPDATE + 3 ) * KEEP( 34 )
3835
& ( NUPDATE + 3 ) * KEEP( 34 )
3657
3840
IF ( NSLAVES .NE. 0 .AND. MTYPE .eq. 1
3658
* .and. NPIV .NE. 0 ) THEN
3841
& .and. NPIV .NE. 0 ) THEN
3659
3842
DO ISLAVE = 1, NSLAVES
3660
3843
PDEST = IW( PTRIST(STEP(INODE)) + 5 + ISLAVE +KEEP(IXSZ))
3666
3849
& Effective_CB_Size, FirstIndex )
3667
3850
222 CALL ZMUMPS_72( NRHS,
3669
* Effective_CB_Size, LD_WCBCB, LD_WCBPIV, NPIV,
3670
* WCB( PCB_COURANT + NELIM + FirstIndex - 1 ),
3671
* WCB( PPIV_COURANT ),
3672
* PDEST, COMM, IERR )
3852
& Effective_CB_Size, LD_WCBCB, LD_WCBPIV, NPIV,
3853
& WCB( PCB_COURANT + NELIM + FirstIndex - 1 ),
3854
& WCB( PPIV_COURANT ),
3855
& PDEST, COMM, IERR )
3673
3856
IF ( IERR .EQ. -1 ) THEN
3674
3857
CALL ZMUMPS_303( .FALSE., FLAG,
3675
* BUFR, LBUFR, LBUFR_BYTES,
3676
* MYID, SLAVEF, COMM,
3677
* N, NRHS, IPOOL, LPOOL, III, LEAF,
3678
* NBFIN, NSTK_S, IW, LIW, A, LA, PTRIST,PTRFAC,
3680
* WCB, LWCB, POSWCB, PLEFTWCB, POSIWCB,
3681
* PTRICB, INFO, KEEP,KEEP8, STEP,
3858
& BUFR, LBUFR, LBUFR_BYTES,
3859
& MYID, SLAVEF, COMM,
3860
& N, NRHS, IPOOL, LPOOL, III, LEAF,
3861
& NBFIN, NSTK_S, IW, LIW, A, LA, PTRIST,PTRFAC,
3863
& WCB, LWCB, POSWCB, PLEFTWCB, POSIWCB,
3864
& PTRICB, INFO, KEEP,KEEP8, STEP,
3685
3868
IF ( INFO( 1 ) .LT. 0 ) GOTO 270
3687
3870
ELSE IF ( IERR .EQ. -2 ) THEN
3688
3871
INFO( 1 ) = -17
3689
3872
INFO( 2 ) = (NPIV+Effective_CB_Size)*NRHS*KEEP(35) +
3690
* ( Effective_CB_Size + 4 ) * KEEP( 34 )
3873
& ( Effective_CB_Size + 4 ) * KEEP( 34 )
3692
3875
ELSE IF ( IERR .EQ. -3 ) THEN
3693
3876
INFO( 1 ) = -20
3694
3877
INFO( 2 ) = (NPIV+Effective_CB_Size)*NRHS*KEEP(35) +
3695
* ( Effective_CB_Size + 4 ) * KEEP( 34 )
3878
& ( Effective_CB_Size + 4 ) * KEEP( 34 )
3706
3889
END SUBROUTINE ZMUMPS_302
3707
3890
RECURSIVE SUBROUTINE ZMUMPS_303( BLOQ, FLAG,
3708
* BUFR, LBUFR, LBUFR_BYTES,
3709
* MYID, SLAVEF, COMM,
3710
* N, NRHS, IPOOL, LPOOL, III, LEAF,
3711
* NBFIN, NSTK_S, IW, LIW, A, LA, PTRIST,PTRFAC,
3713
* WCB, LWCB, POSWCB,
3714
* PLEFTWCB, POSIWCB,
3715
* PTRICB, INFO, KEEP,KEEP8, STEP, PROCNODE_STEPS,
3891
& BUFR, LBUFR, LBUFR_BYTES,
3892
& MYID, SLAVEF, COMM,
3893
& N, NRHS, IPOOL, LPOOL, III, LEAF,
3894
& NBFIN, NSTK_S, IW, LIW, A, LA, PTRIST,PTRFAC,
3896
& WCB, LWCB, POSWCB,
3897
& PLEFTWCB, POSIWCB,
3898
& PTRICB, INFO, KEEP,KEEP8, STEP, PROCNODE_STEPS,
3720
3903
INTEGER LBUFR, LBUFR_BYTES
3721
3904
INTEGER MYID, SLAVEF, COMM
3722
3905
INTEGER N, NRHS, LPOOL, III, LEAF, NBFIN
3723
3906
INTEGER LIWCB, LWCB, POSWCB, PLEFTWCB, POSIWCB
3725
3909
INTEGER INFO( 40 ), KEEP( 500)
3726
3910
INTEGER*8 KEEP8(150)
3727
3911
INTEGER BUFR( LBUFR ), IPOOL(LPOOL)
3758
3943
CALL ZMUMPS_44( MYID, SLAVEF, COMM )
3760
3945
CALL MPI_RECV( BUFR, LBUFR_BYTES, MPI_PACKED,
3761
* MSGSOU, MSGTAG, COMM, STATUS, IERR )
3946
& MSGSOU, MSGTAG, COMM, STATUS, IERR )
3762
3947
CALL ZMUMPS_323( BUFR, LBUFR, LBUFR_BYTES,
3763
* MSGTAG, MSGSOU, MYID, SLAVEF, COMM,
3764
* N, NRHS, IPOOL, LPOOL, III, LEAF,
3765
* NBFIN, NSTK_S, IW, LIW, A, LA, PTRIST, PTRFAC,
3767
* WCB, LWCB, POSWCB,
3768
* PLEFTWCB, POSIWCB,
3769
* PTRICB, INFO, KEEP,KEEP8, STEP,
3948
& MSGTAG, MSGSOU, MYID, SLAVEF, COMM,
3949
& N, NRHS, IPOOL, LPOOL, III, LEAF,
3950
& NBFIN, NSTK_S, IW, LIW, A, LA, PTRIST, PTRFAC,
3952
& WCB, LWCB, POSWCB,
3953
& PLEFTWCB, POSIWCB,
3954
& PTRICB, INFO, KEEP,KEEP8, STEP,
3776
3961
END SUBROUTINE ZMUMPS_303
3777
3962
SUBROUTINE ZMUMPS_249(N, A, LA, IW, LIW, W, LWC,
3779
* RHSCOMP, LRHSCOMP, POSINRHSCOMP,
3780
* PTRICB, PTRACB, IWCB, LIWW, W2,
3781
* NE_STEPS, NA, LNA, STEP,
3782
* FRERE, FILS, IPOOL, LPOOL, PTRIST, PTRFAC, MYLEAF, INFO,
3784
* SLAVEF, COMM,MYID, BUFR, LBUFR, LBUFR_BYTES,
3785
* KEEP,KEEP8, RHS_ROOT, MTYPE,
3787
* ISTEP_TO_INIV2, TAB_POS_IN_PERE, PANEL_POS, LPANEL_POS
3964
& RHSCOMP, LRHSCOMP, POSINRHSCOMP,
3965
& PTRICB, PTRACB, IWCB, LIWW, W2,
3966
& NE_STEPS, NA, LNA, STEP,
3967
& FRERE, FILS, IPOOL, LPOOL, PTRIST, PTRFAC, MYLEAF, INFO,
3969
& SLAVEF, COMM,MYID, BUFR, LBUFR, LBUFR_BYTES,
3970
& KEEP,KEEP8, RHS_ROOT, MTYPE,
3972
& ISTEP_TO_INIV2, TAB_POS_IN_PERE, PANEL_POS, LPANEL_POS
3790
3975
USE ZMUMPS_COMM_BUFFER
3793
INTEGER N,LA,LIW,LIWW,LWC,LPOOL,LNA
3979
INTEGER N,LIW,LIWW,LWC,LPOOL,LNA
3794
3980
INTEGER SLAVEF,MYLEAF,COMM,MYID
3795
3981
INTEGER LPANEL_POS
3796
3982
INTEGER KEEP( 500 )
3897
4088
BLOQ = ( ( III .EQ. IIPOOL )
3899
4090
CALL ZMUMPS_41( BLOQ, FLAG, BUFR, LBUFR,
3900
* LBUFR_BYTES, MYID, SLAVEF, COMM,
3901
* N, IWCB, LIWW, POSIWCB,
3903
* IIPOOL, NBFINF, PTRICB, PTRACB, INFO,
3904
* IPOOL, LPOOL, PANEL_POS, LPANEL_POS,
3905
* STEP, FRERE, FILS, PROCNODE_STEPS,
3906
* PLEFTW, KEEP,KEEP8,
3907
* PTRIST, PTRFAC, IW, LIW, A, LA, W2, MYLEAFE,
3908
* RHS, LRHS, NRHS, MTYPE,
3909
* RHSCOMP, LRHSCOMP, POSINRHSCOMP
4091
& LBUFR_BYTES, MYID, SLAVEF, COMM,
4092
& N, IWCB, LIWW, POSIWCB,
4094
& IIPOOL, NBFINF, PTRICB, PTRACB, INFO,
4095
& IPOOL, LPOOL, PANEL_POS, LPANEL_POS,
4096
& STEP, FRERE, FILS, PROCNODE_STEPS,
4097
& PLEFTW, KEEP,KEEP8,
4098
& PTRIST, PTRFAC, IW, LIW, A, LA, W2, MYLEAFE,
4099
& RHS, LRHS, NRHS, MTYPE,
4100
& RHSCOMP, LRHSCOMP, POSINRHSCOMP
3911
4102
IF ( INFO(1) .LT. 0 ) GOTO 340
3912
4103
IF ( .NOT. FLAG ) THEN
3913
4104
IF (III .NE. IIPOOL) THEN
3962
4153
POOL_FIRST_POS=IIPOOL
3963
4154
DO I = 1, NBFILS
3964
4155
IF (MUMPS_275(STEP(IF),PROCNODE_STEPS,SLAVEF)
3966
4157
IPOOL(IIPOOL) = IF
3967
4158
IIPOOL = IIPOOL + 1
3969
4160
PROCDEST = MUMPS_275(STEP(IF),PROCNODE_STEPS,
3971
4162
IF (.NOT. DEJA_SEND( PROCDEST )) THEN
3972
4163
600 CALL ZMUMPS_78( NRHS, IF, 0, 0,
3973
* LONG, LONG, IW( J1 ),
3974
* RHS_ROOT( 1 ), PROCDEST,
3975
* NOEUD, COMM, IERR )
4164
& LONG, LONG, IW( J1 ),
4165
& RHS_ROOT( 1 ), PROCDEST,
4166
& NOEUD, COMM, IERR )
3976
4167
IF ( IERR .EQ. -1 ) THEN
3977
4168
CALL ZMUMPS_41(
3979
* BUFR, LBUFR, LBUFR_BYTES,
3980
* MYID, SLAVEF, COMM,
3981
* N, IWCB, LIWW, POSIWCB,
3983
* IIPOOL, NBFINF, PTRICB, PTRACB, INFO,
3984
* IPOOL, LPOOL, PANEL_POS, LPANEL_POS,
3985
* STEP, FRERE, FILS, PROCNODE_STEPS,
3986
* PLEFTW, KEEP,KEEP8,
3987
* PTRIST, PTRFAC, IW, LIW, A, LA, W2, MYLEAFE,
3988
* RHS, LRHS, NRHS, MTYPE,
3989
* RHSCOMP, LRHSCOMP, POSINRHSCOMP
4170
& BUFR, LBUFR, LBUFR_BYTES,
4171
& MYID, SLAVEF, COMM,
4172
& N, IWCB, LIWW, POSIWCB,
4174
& IIPOOL, NBFINF, PTRICB, PTRACB, INFO,
4175
& IPOOL, LPOOL, PANEL_POS, LPANEL_POS,
4176
& STEP, FRERE, FILS, PROCNODE_STEPS,
4177
& PLEFTW, KEEP,KEEP8,
4178
& PTRIST, PTRFAC, IW, LIW, A, LA, W2, MYLEAFE,
4179
& RHS, LRHS, NRHS, MTYPE,
4180
& RHSCOMP, LRHSCOMP, POSINRHSCOMP
3991
4182
IF ( INFO( 1 ) .LT. 0 ) GOTO 340
3993
4184
ELSE IF ( IERR .EQ. -2 ) THEN
3994
4185
INFO( 1 ) = -17
3995
4186
INFO( 2 ) = LONG * KEEP(35) +
3996
* ( LONG + 2 ) * KEEP(34)
4187
& ( LONG + 2 ) * KEEP(34)
3998
4189
ELSE IF ( IERR .EQ. -3 ) THEN
3999
4190
INFO( 1 ) = -20
4000
4191
INFO( 2 ) = LONG * KEEP(35) +
4001
* ( LONG + 2 ) * KEEP(34)
4192
& ( LONG + 2 ) * KEEP(34)
4004
4195
DEJA_SEND( PROCDEST ) = .TRUE.
4093
4284
500 DEST = IW( PTRIST(STEP(INODE))+5+ISLAVE+KEEP(IXSZ))
4094
4285
CALL ZMUMPS_63(NRHS, INODE,
4095
* W(Offset+PTRACB(STEP(INODE))), EffectiveSize,
4097
* BACKSLV_MASTER2SLAVE,
4286
& W(Offset+PTRACB(STEP(INODE))), EffectiveSize,
4288
& BACKSLV_MASTER2SLAVE,
4099
4290
IF ( IERR .EQ. -1 ) THEN
4100
4291
CALL ZMUMPS_41(
4102
* BUFR, LBUFR, LBUFR_BYTES,
4103
* MYID, SLAVEF, COMM,
4104
* N, IWCB, LIWW, POSIWCB,
4106
* IIPOOL, NBFINF, PTRICB, PTRACB, INFO,
4107
* IPOOL, LPOOL, PANEL_POS, LPANEL_POS,
4108
* STEP, FRERE, FILS,
4109
* PROCNODE_STEPS, PLEFTW, KEEP,KEEP8,
4110
* PTRIST, PTRFAC, IW, LIW, A, LA, W2, MYLEAFE,
4111
* RHS, LRHS, NRHS, MTYPE,
4112
* RHSCOMP, LRHSCOMP, POSINRHSCOMP
4293
& BUFR, LBUFR, LBUFR_BYTES,
4294
& MYID, SLAVEF, COMM,
4295
& N, IWCB, LIWW, POSIWCB,
4297
& IIPOOL, NBFINF, PTRICB, PTRACB, INFO,
4298
& IPOOL, LPOOL, PANEL_POS, LPANEL_POS,
4299
& STEP, FRERE, FILS,
4300
& PROCNODE_STEPS, PLEFTW, KEEP,KEEP8,
4301
& PTRIST, PTRFAC, IW, LIW, A, LA, W2, MYLEAFE,
4302
& RHS, LRHS, NRHS, MTYPE,
4303
& RHSCOMP, LRHSCOMP, POSINRHSCOMP
4114
4305
IF ( INFO( 1 ) .LT. 0 ) GOTO 340
4116
4307
ELSE IF ( IERR .EQ. -2 ) THEN
4117
4308
INFO( 1 ) = -17
4118
4309
INFO( 2 ) = EffectiveSize * KEEP(35) +
4121
4312
ELSE IF ( IERR .EQ. -3 ) THEN
4122
4313
INFO( 1 ) = -20
4123
4314
INFO( 2 ) = EffectiveSize * KEEP(35) +
4127
4318
Offset = Offset + EffectiveSize
4129
4320
IWCB( PTRICB(STEP( INODE )) + 1 ) = 0
4130
4321
CALL ZMUMPS_151(NRHS,N, KEEP(28), IWCB, LIWW, W, LWC,
4131
* POSWCB,POSIWCB,PTRICB,PTRACB)
4322
& POSWCB,POSIWCB,PTRICB,PTRACB)
4134
4325
IPOS = PTRIST(STEP(INODE)) + 2 + KEEP(IXSZ)
4279
4470
BEG_PANEL = JJ- PANEL_SIZE+1
4281
4472
LDAJ = LIELL-BEG_PANEL+1
4282
APOSDEB = APOSDEB - NBJ*LDAJ
4473
APOSDEB = APOSDEB - int(NBJ,8)*int(LDAJ,8)
4283
4474
PTWCB_PANEL = PTWCB + BEG_PANEL - 1
4284
4475
NCB_PANEL = LDAJ - NBJ
4285
4476
IF (KEEP(50).NE.1 .AND. MUST_BE_PERMUTED) THEN
4286
4477
CALL ZMUMPS_667(TYPEF, TMP_NBPANELS,
4287
* I_PIVRPTR, I_PIVR, IPOS + 1 + 2 * LIELL, IW, LIW)
4478
& I_PIVRPTR, I_PIVR, IPOS + 1 + 2 * LIELL, IW, LIW)
4288
4479
IF (NPIV.EQ.(IW(I_PIVRPTR)-1)) THEN
4289
4480
MUST_BE_PERMUTED=.FALSE.
4291
4482
CALL ZMUMPS_698(
4292
* IW(I_PIVR + IW(I_PIVRPTR+IPANEL-1)-IW(I_PIVRPTR)),
4293
* NPIV-IW(I_PIVRPTR+IPANEL-1)+1,
4294
* IW(I_PIVRPTR+IPANEL-1)-1,
4296
* LDAJ, NBJ, BEG_PANEL-1)
4483
& IW(I_PIVR + IW(I_PIVRPTR+IPANEL-1)-IW(I_PIVRPTR)),
4484
& NPIV-IW(I_PIVRPTR+IPANEL-1)+1,
4485
& IW(I_PIVRPTR+IPANEL-1)-1,
4487
& LDAJ, NBJ, BEG_PANEL-1)
4299
4490
IF ( NRHS == 1 ) THEN
4300
4491
IF (NCB_PANEL.NE.0) THEN
4301
4492
CALL ZGEMV( 'T', NCB_PANEL, NBJ, ALPHA,
4302
* A( APOSDEB + NBJ ), LDAJ,
4303
* W( NBJ + PTWCB_PANEL ),
4305
* W(PTWCB_PANEL), 1 )
4493
& A( APOSDEB + int(NBJ,8) ), LDAJ,
4494
& W( NBJ + PTWCB_PANEL ),
4496
& W(PTWCB_PANEL), 1 )
4307
4498
IF (MTYPE.NE.1) THEN
4308
4499
CALL ZTRSV('L','T','U', NBJ, A(APOSDEB), LDAJ,
4309
* W(PTWCB_PANEL), 1)
4500
& W(PTWCB_PANEL), 1)
4311
4502
CALL ZTRSV('L','T','N', NBJ, A(APOSDEB), LDAJ,
4312
* W(PTWCB_PANEL), 1)
4503
& W(PTWCB_PANEL), 1)
4315
4506
IF (NCB_PANEL.NE.0) THEN
4316
4507
CALL ZGEMM( 'T', 'N', NBJ, NRHS, NCB_PANEL, ALPHA,
4317
* A(APOSDEB +NBJ), LDAJ, W(NBJ+PTWCB_PANEL),LIELL,
4318
* ONE, W(PTWCB_PANEL),LIELL)
4508
& A(APOSDEB +int(NBJ,8)), LDAJ,
4509
& W(NBJ+PTWCB_PANEL),LIELL,
4510
& ONE, W(PTWCB_PANEL),LIELL)
4320
4512
IF (MTYPE.NE.1) THEN
4321
4513
CALL ZTRSM('L','L','T','U',NBJ, NRHS, ONE,
4323
* LDAJ, W(PTWCB_PANEL), LIELL)
4515
& LDAJ, W(PTWCB_PANEL), LIELL)
4325
4517
CALL ZTRSM('L','L','T','N',NBJ, NRHS, ONE,
4327
* LDAJ, W(PTWCB_PANEL), LIELL)
4519
& LDAJ, W(PTWCB_PANEL), LIELL)
4330
4522
IF (.NOT. TWOBYTWO) JJ=BEG_PANEL-1
4333
4525
IF (KEEP(201).EQ.0.OR.KEEP(201).EQ.2)THEN
4334
4526
IF ( LIELL .GT. NPIV ) THEN
4335
4527
IF ( MTYPE .eq. 1 ) THEN
4528
IST = APOS + int(NPIV,8)
4337
4529
IF (NRHS == 1) THEN
4338
4530
CALL ZGEMV( 'T', NCB, NPIV, ALPHA, A(IST), LIELL,
4339
* W(NPIV + PTWCB), 1,
4531
& W(NPIV + PTWCB), 1,
4343
4535
CALL ZGEMM('T','N', NPIV, NRHS, NCB, ALPHA, A(IST), LIELL,
4344
* W(NPIV+PTWCB), LIELL, ONE,
4536
& W(NPIV+PTWCB), LIELL, ONE,
4348
4540
IF ( KEEP(50) .eq. 0 ) THEN
4349
IST = APOS + NPIV * LIELL
4541
IST = APOS + int(NPIV,8) * int(LIELL,8)
4351
IST = APOS + NPIV * NPIV
4543
IST = APOS + int(NPIV,8) * int(NPIV,8)
4353
4545
IF ( NRHS == 1 ) THEN
4354
4546
CALL ZGEMV( 'N', NPIV, NCB, ALPHA, A( IST ), NPIV,
4355
* W( NPIV + PTWCB ),
4547
& W( NPIV + PTWCB ),
4359
4551
CALL ZGEMM( 'N', 'N', NPIV, NRHS, NCB, ALPHA,
4360
* A(IST), NPIV, W(NPIV+PTWCB),LIELL,
4361
* ONE, W(PTWCB),LIELL)
4552
& A(IST), NPIV, W(NPIV+PTWCB),LIELL,
4553
& ONE, W(PTWCB),LIELL)
4365
4557
IF ( MTYPE .eq. 1 ) THEN
4366
4558
IF ( NRHS == 1 ) THEN
4367
4559
CALL ZTRSV('L', 'T', 'N', NPIV, A(APOS), LIELL,
4370
4562
CALL ZTRSM('L','L','T','N', NPIV, NRHS, ONE, A(APOS),
4371
* LIELL, W(PTWCB), LIELL)
4563
& LIELL, W(PTWCB), LIELL)
4374
4566
IF ( KEEP(50) .EQ. 0 ) THEN
4375
4567
IF ( NRHS == 1 ) THEN
4376
4568
CALL ZTRSV('U','N','U', NPIV, A(APOS), LIELL,
4379
4571
CALL ZTRSM('L','U','N','U', NPIV, NRHS, ONE, A(APOS),
4380
* LIELL,W(PTWCB),LIELL)
4572
& LIELL,W(PTWCB),LIELL)
4383
4575
IF ( NRHS == 1 ) THEN
4384
4576
CALL ZTRSV('U','N','U', NPIV, A(APOS), NPIV,
4387
4579
CALL ZTRSM('L','U','N','U',NPIV, NRHS, ONE, A(APOS),
4388
* NPIV, W(PTWCB), LIELL)
4580
& NPIV, W(PTWCB), LIELL)
4449
4641
IF (.not. DEJA_SEND( PROCDEST )) THEN
4451
4643
CALL ZMUMPS_78( NRHS, IF, 0, 0, LIELL,
4454
* W ( PTRACB(STEP( INODE ))), PROCDEST,
4455
* NOEUD, COMM, IERR )
4646
& W ( PTRACB(STEP( INODE ))), PROCDEST,
4647
& NOEUD, COMM, IERR )
4456
4648
IF ( IERR .EQ. -1 ) THEN
4457
4649
CALL ZMUMPS_41(
4459
* BUFR, LBUFR, LBUFR_BYTES,
4460
* MYID, SLAVEF, COMM,
4461
* N, IWCB, LIWW, POSIWCB,
4463
* IIPOOL, NBFINF, PTRICB, PTRACB, INFO,
4464
* IPOOL, LPOOL, PANEL_POS, LPANEL_POS,
4465
* STEP, FRERE, FILS, PROCNODE_STEPS,
4466
* PLEFTW, KEEP,KEEP8,
4467
* PTRIST, PTRFAC, IW, LIW, A, LA, W2, MYLEAFE,
4468
* RHS, LRHS, NRHS, MTYPE,
4469
* RHSCOMP, LRHSCOMP, POSINRHSCOMP
4651
& BUFR, LBUFR, LBUFR_BYTES,
4652
& MYID, SLAVEF, COMM,
4653
& N, IWCB, LIWW, POSIWCB,
4655
& IIPOOL, NBFINF, PTRICB, PTRACB, INFO,
4656
& IPOOL, LPOOL, PANEL_POS, LPANEL_POS,
4657
& STEP, FRERE, FILS, PROCNODE_STEPS,
4658
& PLEFTW, KEEP,KEEP8,
4659
& PTRIST, PTRFAC, IW, LIW, A, LA, W2, MYLEAFE,
4660
& RHS, LRHS, NRHS, MTYPE,
4661
& RHSCOMP, LRHSCOMP, POSINRHSCOMP
4471
4663
IF ( INFO( 1 ) .LT. 0 ) GOTO 340
4473
4665
ELSE IF ( IERR .EQ. -2 ) THEN
4492
4684
IWCB(PTRICB(STEP(INODE))+1) = IWCB(PTRICB(STEP(INODE))+1)-1
4493
4685
CALL ZMUMPS_151(NRHS,N, KEEP(28), IWCB, LIWW,
4495
* POSWCB,POSIWCB,PTRICB,PTRACB)
4687
& POSWCB,POSIWCB,PTRICB,PTRACB)
4499
4691
CALL ZMUMPS_242(DUMMY, 1, MPI_INTEGER, MYID, COMM, TERREUR,
4502
4694
CALL ZMUMPS_150( MYID,COMM,BUFR,
4503
* LBUFR,LBUFR_BYTES )
4695
& LBUFR,LBUFR_BYTES )
4505
4697
END SUBROUTINE ZMUMPS_249
4506
4698
RECURSIVE SUBROUTINE ZMUMPS_41(
4508
* BUFR, LBUFR, LBUFR_BYTES,
4509
* MYID, SLAVEF, COMM,
4510
* N, IWCB, LIWW, POSIWCB,
4512
* IIPOOL, NBFINF, PTRICB, PTRACB, INFO,
4513
* IPOOL, LPOOL, PANEL_POS, LPANEL_POS,
4514
* STEP, FRERE, FILS, PROCNODE_STEPS,
4515
* PLEFTW, KEEP,KEEP8,
4516
* PTRIST, PTRFAC, IW, LIW, A, LA, W2, MYLEAFE, RHS,
4517
* LRHS, NRHS, MTYPE,
4518
* RHSCOMP, LRHSCOMP, POSINRHSCOMP
4700
& BUFR, LBUFR, LBUFR_BYTES,
4701
& MYID, SLAVEF, COMM,
4702
& N, IWCB, LIWW, POSIWCB,
4704
& IIPOOL, NBFINF, PTRICB, PTRACB, INFO,
4705
& IPOOL, LPOOL, PANEL_POS, LPANEL_POS,
4706
& STEP, FRERE, FILS, PROCNODE_STEPS,
4707
& PLEFTW, KEEP,KEEP8,
4708
& PTRIST, PTRFAC, IW, LIW, A, LA, W2, MYLEAFE, RHS,
4709
& LRHS, NRHS, MTYPE,
4710
& RHSCOMP, LRHSCOMP, POSINRHSCOMP
4521
4713
LOGICAL BLOQ, FLAG
4522
4714
INTEGER LBUFR, LBUFR_BYTES
4567
4761
CALL ZMUMPS_44( MYID, SLAVEF, COMM )
4569
4763
CALL MPI_RECV(BUFR, LBUFR_BYTES, MPI_PACKED, MSGSOU,
4570
* MSGTAG, COMM, STATUS, IERR)
4764
& MSGTAG, COMM, STATUS, IERR)
4571
4765
CALL ZMUMPS_42( MSGTAG, MSGSOU,
4572
* BUFR, LBUFR, LBUFR_BYTES,
4573
* MYID, SLAVEF, COMM,
4574
* N, IWCB, LIWW, POSIWCB,
4576
* IIPOOL, NBFINF, PTRICB, PTRACB, INFO,
4577
* IPOOL, LPOOL, PANEL_POS, LPANEL_POS, STEP,
4578
* FRERE, FILS, PROCNODE_STEPS, PLEFTW,
4580
* PTRIST, PTRFAC, IW, LIW, A, LA, W2, MYLEAFE,
4581
* RHS, LRHS, NRHS, MTYPE,
4582
* RHSCOMP, LRHSCOMP, POSINRHSCOMP
4766
& BUFR, LBUFR, LBUFR_BYTES,
4767
& MYID, SLAVEF, COMM,
4768
& N, IWCB, LIWW, POSIWCB,
4770
& IIPOOL, NBFINF, PTRICB, PTRACB, INFO,
4771
& IPOOL, LPOOL, PANEL_POS, LPANEL_POS, STEP,
4772
& FRERE, FILS, PROCNODE_STEPS, PLEFTW,
4774
& PTRIST, PTRFAC, IW, LIW, A, LA, W2, MYLEAFE,
4775
& RHS, LRHS, NRHS, MTYPE,
4776
& RHSCOMP, LRHSCOMP, POSINRHSCOMP
4587
4781
END SUBROUTINE ZMUMPS_41
4588
4782
RECURSIVE SUBROUTINE ZMUMPS_42(
4590
* BUFR, LBUFR, LBUFR_BYTES,
4591
* MYID, SLAVEF, COMM,
4592
* N, IWCB, LIWW, POSIWCB,
4594
* IIPOOL, NBFINF, PTRICB, PTRACB, INFO,
4595
* IPOOL, LPOOL, PANEL_POS, LPANEL_POS, STEP,
4596
* FRERE, FILS, PROCNODE_STEPS, PLEFTW, KEEP,KEEP8,
4597
* PTRIST, PTRFAC, IW, LIW, A, LA, W2, MYLEAFE,
4598
* RHS, LRHS, NRHS, MTYPE,
4599
* RHSCOMP, LRHSCOMP, POSINRHSCOMP
4784
& BUFR, LBUFR, LBUFR_BYTES,
4785
& MYID, SLAVEF, COMM,
4786
& N, IWCB, LIWW, POSIWCB,
4788
& IIPOOL, NBFINF, PTRICB, PTRACB, INFO,
4789
& IPOOL, LPOOL, PANEL_POS, LPANEL_POS, STEP,
4790
& FRERE, FILS, PROCNODE_STEPS, PLEFTW, KEEP,KEEP8,
4791
& PTRIST, PTRFAC, IW, LIW, A, LA, W2, MYLEAFE,
4792
& RHS, LRHS, NRHS, MTYPE,
4793
& RHSCOMP, LRHSCOMP, POSINRHSCOMP
4602
4796
USE ZMUMPS_COMM_BUFFER
4633
4829
INCLUDE 'mumps_tags.h'
4634
4830
INTEGER POSITION, IF, INODE, IERR, LONG, DUMMY(1)
4635
4831
INTEGER P_UPDATE, P_SOL_MAS, LIELL, K
4636
INTEGER NPIV, NROW_L, APOS, IPOS, NROW_RECU
4637
INTEGER I, JJ, IN, PROCDEST, J1, J2, IFR, IST, LDA
4832
INTEGER(8) :: APOS, IST
4833
INTEGER NPIV, NROW_L, IPOS, NROW_RECU
4834
INTEGER I, JJ, IN, PROCDEST, J1, J2, IFR, LDA
4638
4835
INTEGER NSLAVES, NELIM, J, POSINDICES, INODEPOS,
4639
4836
& IPOSINRHSCOMP
4641
4838
COMPLEX*16 ZERO, ALPHA, ONE
4642
PARAMETER( ZERO = 0.0D0, ALPHA = -1.0D0, ONE = 1.0D0)
4839
PARAMETER (ZERO=(0.0D0,0.0D0),
4840
& ONE=(1.0D0,0.0D0),
4841
& ALPHA=(-1.0D0,0.0D0))
4643
4842
INCLUDE 'mumps_headers.h'
4644
4843
INTEGER POOL_FIRST_POS, TMP
4645
4844
LOGICAL DEJA_SEND( 0:SLAVEF-1 )
4646
4845
INTEGER MUMPS_275
4647
4846
EXTERNAL MUMPS_275, ZTRSV, ZTRSM, ZGEMV, ZGEMM
4648
INTEGER APOSDEB, LDAJ, NBJ, LIWFAC, TailleEcrite,
4649
& APOSTEMP, NBJLAST, NPIV_LAST, PANEL_SIZE,
4847
INTEGER(8) :: APOSDEB, NBENTRIES_ALLPANELS
4848
INTEGER LDAJ, NBJ, LIWFAC,
4849
& NBJLAST, NPIV_LAST, PANEL_SIZE,
4650
4850
& PTWCB_PANEL, NCB_PANEL, TYPEF
4651
4851
LOGICAL TWOBYTWO
4652
4852
INTEGER BEG_PANEL
4763
4954
PLEFTW = P_SOL_MAS + NROW_L * NRHS
4765
4956
CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
4766
* W( P_SOL_MAS+(K-1)*NROW_L),NROW_L,
4767
* MPI_DOUBLE_COMPLEX,
4957
& W( P_SOL_MAS+(K-1)*NROW_L),NROW_L,
4958
& MPI_DOUBLE_COMPLEX,
4770
4961
IF (KEEP(201).EQ.1) THEN
4771
4962
IF ( NRHS == 1 ) THEN
4772
4963
CALL ZGEMV( 'T', NROW_L, NPIV, ALPHA, A( APOS ), NROW_L,
4773
* W( P_SOL_MAS ), 1, ZERO,
4774
* W( P_UPDATE ), 1 )
4964
& W( P_SOL_MAS ), 1, ZERO,
4965
& W( P_UPDATE ), 1 )
4776
4967
CALL ZGEMM( 'T', 'N', NPIV, NRHS, NROW_L, ALPHA, A(APOS),
4777
* NROW_L, W( P_SOL_MAS ), NROW_L, ZERO, W( P_UPDATE ),
4968
& NROW_L, W( P_SOL_MAS ), NROW_L, ZERO, W( P_UPDATE ),
4781
4972
IF ( NRHS == 1 ) THEN
4782
4973
CALL ZGEMV( 'N', NPIV, NROW_L, ALPHA, A( APOS ), NPIV,
4783
* W( P_SOL_MAS ), 1, ZERO,
4784
* W( P_UPDATE ), 1 )
4974
& W( P_SOL_MAS ), 1, ZERO,
4975
& W( P_UPDATE ), 1 )
4786
4977
CALL ZGEMM( 'N', 'N', NPIV, NRHS, NROW_L, ALPHA, A(APOS),
4787
* NPIV, W( P_SOL_MAS ), NROW_L, ZERO, W( P_UPDATE ),
4978
& NPIV, W( P_SOL_MAS ), NROW_L, ZERO, W( P_UPDATE ),
4791
4982
IF (KEEP(201).NE.0) THEN
4792
4983
CALL ZMUMPS_598(INODE,PTRFAC,KEEP(28),
4794
4985
IF(IERR.LT.0)THEN
4800
4991
PLEFTW = PLEFTW - NROW_L * NRHS
4802
4993
CALL ZMUMPS_63( NRHS, INODE, W(P_UPDATE),
4805
* BACKSLV_UPDATERHS,
4996
& BACKSLV_UPDATERHS,
4807
4998
IF ( IERR .EQ. -1 ) THEN
4808
4999
CALL ZMUMPS_41(
4810
* BUFR, LBUFR, LBUFR_BYTES,
4811
* MYID, SLAVEF, COMM,
4812
* N, IWCB, LIWW, POSIWCB,
4814
* IIPOOL, NBFINF, PTRICB, PTRACB, INFO,
4815
* IPOOL, LPOOL, PANEL_POS, LPANEL_POS, STEP,
4816
* FRERE, FILS, PROCNODE_STEPS, PLEFTW, KEEP,KEEP8,
4817
* PTRIST, PTRFAC, IW, LIW, A, LA, W2, MYLEAFE,
4818
* RHS, LRHS, NRHS, MTYPE,
4819
* RHSCOMP, LRHSCOMP, POSINRHSCOMP
5001
& BUFR, LBUFR, LBUFR_BYTES,
5002
& MYID, SLAVEF, COMM,
5003
& N, IWCB, LIWW, POSIWCB,
5005
& IIPOOL, NBFINF, PTRICB, PTRACB, INFO,
5006
& IPOOL, LPOOL, PANEL_POS, LPANEL_POS, STEP,
5007
& FRERE, FILS, PROCNODE_STEPS, PLEFTW, KEEP,KEEP8,
5008
& PTRIST, PTRFAC, IW, LIW, A, LA, W2, MYLEAFE,
5009
& RHS, LRHS, NRHS, MTYPE,
5010
& RHSCOMP, LRHSCOMP, POSINRHSCOMP
4821
5012
IF ( INFO( 1 ) .LT. 0 ) GOTO 270
4823
5014
ELSE IF ( IERR .EQ. -2 ) THEN
4872
5063
IW(PTRIST(STEP(INODE))+XXS) =
4873
* IW(PTRIST(STEP(INODE))+XXS) - 1
5064
& IW(PTRIST(STEP(INODE))+XXS) - 1
4874
5065
IF ( IW(PTRIST(STEP(INODE))+XXS).EQ.C_FINI ) THEN
4875
5066
IF (KEEP(201).NE.0) THEN
4876
5067
CALL ZMUMPS_643(
4877
5068
& INODE,PTRFAC,KEEP,A,LA,STEP,
4878
$ KEEP8,N,MUST_BE_PERMUTED,IERR)
5069
& KEEP8,N,MUST_BE_PERMUTED,IERR)
4879
5070
IF(IERR.LT.0)THEN
4884
IF (KEEP(201).EQ.1) THEN
4887
& PTRIST(STEP(INODE))+IW(PTRIST(STEP(INODE))+XXI)-1
4890
MUST_BE_PERMUTED = .FALSE.
5075
IF (KEEP(201).EQ.1 .AND. KEEP(50).NE.1) THEN
5077
& IW(IPOS+1+2*LIELL),
5078
& MUST_BE_PERMUTED )
4894
5081
APOS = PTRFAC(IW(INODEPOS))
4895
5082
IF (KEEP(201).EQ.1) THEN
4896
LIWFAC = IW(PTRIST(STEP(INODE))+XXI)
4897
IF (MTYPE.NE.1) THEN
4900
CALL ZMUMPS_690( INODE, TYPEF,
4901
& IW(PTRIST(STEP(INODE))), LIWFAC, NROW_L,
4902
& PANEL_SIZE, TailleEcrite)
4904
IF (PANEL_SIZE.LT.0) THEN
4905
WRITE(6,*) ' Internal error in bwd solve PANEL_SIZE=',
5083
LIWFAC = IW(PTRIST(STEP(INODE))+XXI)
5086
PANEL_SIZE = ZMUMPS_690(NROW_L)
5087
IF (PANEL_SIZE.LT.0) THEN
5088
WRITE(6,*) ' Internal error in bwd solve PANEL_SIZE=',
4910
5093
IF ( POSIWCB - 2 .LT. 0 .or.
4911
* POSWCB - LIELL*NRHS .LT. PLEFTW - 1 ) THEN
5094
& POSWCB - LIELL*NRHS .LT. PLEFTW - 1 ) THEN
4912
5095
CALL ZMUMPS_95( NRHS, N, KEEP(28), IWCB,
4914
* POSWCB, POSIWCB, PTRICB, PTRACB)
5097
& POSWCB, POSIWCB, PTRICB, PTRACB)
4915
5098
IF ( POSWCB - LIELL*NRHS .LT. PLEFTW - 1 ) THEN
4916
5099
INFO( 1 ) = -11
4917
5100
INFO( 2 ) = LIELL * NRHS - POSWCB - PLEFTW + 1
4991
5182
BEG_PANEL = JJ- PANEL_SIZE+1
4993
5184
LDAJ = NROW_L-BEG_PANEL+1
4994
APOSDEB = APOSDEB - NBJ*LDAJ
5185
APOSDEB = APOSDEB - int(NBJ,8)*int(LDAJ,8)
4995
5186
PTWCB_PANEL = PTRACB(STEP(INODE)) + BEG_PANEL - 1
4996
5187
NCB_PANEL = LDAJ - NBJ
4997
5188
IF (KEEP(50).NE.1 .AND.MUST_BE_PERMUTED) THEN
4998
5189
CALL ZMUMPS_667(TYPEF, TMP_NBPANELS,
4999
* I_PIVRPTR, I_PIVR, IPOS + 1 + 2 * LIELL, IW, LIW)
5190
& I_PIVRPTR, I_PIVR, IPOS + 1 + 2 * LIELL, IW, LIW)
5000
5191
CALL ZMUMPS_698(
5001
* IW(I_PIVR + IW(I_PIVRPTR+IPANEL-1)-IW(I_PIVRPTR)),
5002
* NPIV-IW(I_PIVRPTR+IPANEL-1)+1,
5003
* IW(I_PIVRPTR+IPANEL-1)-1,
5005
* LDAJ, NBJ, BEG_PANEL-1)
5192
& IW(I_PIVR + IW(I_PIVRPTR+IPANEL-1)-IW(I_PIVRPTR)),
5193
& NPIV-IW(I_PIVRPTR+IPANEL-1)+1,
5194
& IW(I_PIVRPTR+IPANEL-1)-1,
5196
& LDAJ, NBJ, BEG_PANEL-1)
5007
5198
IF ( NRHS == 1 ) THEN
5008
5199
IF (NCB_PANEL.NE.0) THEN
5009
5200
CALL ZGEMV( 'T', NCB_PANEL, NBJ, ALPHA,
5010
* A( APOSDEB + NBJ ), LDAJ,
5011
* W( NBJ + PTWCB_PANEL ),
5013
* W(PTWCB_PANEL), 1 )
5201
& A( APOSDEB + int(NBJ,8) ), LDAJ,
5202
& W( NBJ + PTWCB_PANEL ),
5204
& W(PTWCB_PANEL), 1 )
5015
5206
CALL ZTRSV('L','T','U', NBJ, A(APOSDEB), LDAJ,
5016
* W(PTWCB_PANEL), 1)
5207
& W(PTWCB_PANEL), 1)
5018
5209
IF (NCB_PANEL.NE.0) THEN
5019
5210
CALL ZGEMM( 'T', 'N', NBJ, NRHS, NCB_PANEL, ALPHA,
5020
* A(APOSDEB +NBJ), LDAJ, W(NBJ+PTWCB_PANEL),LIELL,
5021
* ONE, W(PTWCB_PANEL),LIELL)
5211
& A(APOSDEB + int(NBJ,8)), LDAJ,
5212
& W(NBJ+PTWCB_PANEL),LIELL,
5213
& ONE, W(PTWCB_PANEL),LIELL)
5023
5215
CALL ZTRSM('L','L','T','U',NBJ, NRHS, ONE,
5025
* LDAJ, W(PTWCB_PANEL), LIELL)
5217
& LDAJ, W(PTWCB_PANEL), LIELL)
5027
5219
IF (.NOT. TWOBYTWO) JJ=BEG_PANEL-1
5031
5223
IF (NELIM .GT.0) THEN
5032
5224
IF ( KEEP(50) .eq. 0 ) THEN
5033
IST = APOS + NPIV * LIELL
5225
IST = APOS + int(NPIV,8) * int(LIELL,8)
5035
IST = APOS + NPIV * NPIV
5227
IST = APOS + int(NPIV,8) * int(NPIV,8)
5037
5229
IF ( NRHS == 1 ) THEN
5038
5230
CALL ZGEMV( 'N', NPIV, NELIM, ALPHA,
5040
* W( NPIV + PTRACB(STEP(INODE)) ),
5042
* W(PTRACB(STEP(INODE))), 1 )
5232
& W( NPIV + PTRACB(STEP(INODE)) ),
5234
& W(PTRACB(STEP(INODE))), 1 )
5044
5236
CALL ZGEMM( 'N', 'N', NPIV, NRHS, NELIM, ALPHA,
5045
* A(IST), NPIV, W(NPIV+PTRACB(STEP(INODE))),LIELL,
5046
* ONE, W(PTRACB(STEP(INODE))),LIELL)
5237
& A(IST), NPIV, W(NPIV+PTRACB(STEP(INODE))),LIELL,
5238
& ONE, W(PTRACB(STEP(INODE))),LIELL)
5049
5241
IF ( NRHS == 1 ) THEN
5050
5242
CALL ZTRSV( 'U', 'N', 'U', NPIV, A(APOS), LDA,
5051
* W(PTRACB(STEP(INODE))),1)
5243
& W(PTRACB(STEP(INODE))),1)
5053
5245
CALL ZTRSM( 'L','U', 'N', 'U', NPIV, NRHS, ONE,
5055
* W(PTRACB(STEP(INODE))),LIELL)
5247
& W(PTRACB(STEP(INODE))),LIELL)
5058
5250
IF (KEEP(201).NE.0) THEN
5059
5251
CALL ZMUMPS_598(INODE,PTRFAC,KEEP(28),
5061
5253
IF(IERR.LT.0)THEN
5079
5271
MYLEAFE = MYLEAFE - 1
5080
5272
IF (MYLEAFE .EQ. 0) THEN
5081
5273
CALL ZMUMPS_242( DUMMY, 1, MPI_INTEGER, MYID, COMM,
5083
5275
NBFINF = NBFINF - 1
5085
5277
IWCB( PTRICB(STEP(INODE)) + 1 ) = 0
5086
5278
CALL ZMUMPS_151(NRHS, N, KEEP(28),
5087
* IWCB, LIWW, W, LWC,
5088
* POSWCB, POSIWCB, PTRICB, PTRACB)
5279
& IWCB, LIWW, W, LWC,
5280
& POSWCB, POSIWCB, PTRICB, PTRACB)
5091
5283
DO I = 0, SLAVEF - 1
5092
5284
DEJA_SEND( I ) = .FALSE.
5096
5288
POOL_FIRST_POS = IIPOOL
5097
5289
IF (MUMPS_275(STEP(IN),PROCNODE_STEPS,
5098
* SLAVEF) .EQ. MYID) THEN
5290
& SLAVEF) .EQ. MYID) THEN
5099
5291
IPOOL(IIPOOL ) = IN
5100
5292
IIPOOL = IIPOOL + 1
5102
5294
PROCDEST = MUMPS_275( STEP(IN), PROCNODE_STEPS,
5104
5296
IF ( .NOT. DEJA_SEND( PROCDEST ) ) THEN
5105
5297
110 CALL ZMUMPS_78( NRHS, IN, 0, 0,
5107
* IW( POSINDICES ) ,
5108
* W( PTRACB(STEP(INODE))),
5109
* PROCDEST, NOEUD, COMM, IERR )
5299
& IW( POSINDICES ) ,
5300
& W( PTRACB(STEP(INODE))),
5301
& PROCDEST, NOEUD, COMM, IERR )
5110
5302
IF ( IERR .EQ. -1 ) THEN
5111
5303
CALL ZMUMPS_41(
5113
* BUFR, LBUFR, LBUFR_BYTES,
5114
* MYID, SLAVEF, COMM,
5115
* N, IWCB, LIWW, POSIWCB,
5117
* IIPOOL, NBFINF, PTRICB, PTRACB, INFO,
5118
* IPOOL, LPOOL, PANEL_POS, LPANEL_POS, STEP,
5119
* FRERE, FILS, PROCNODE_STEPS, PLEFTW, KEEP,KEEP8,
5120
* PTRIST, PTRFAC, IW, LIW, A, LA, W2, MYLEAFE,
5121
* RHS, LRHS, NRHS, MTYPE,
5122
* RHSCOMP, LRHSCOMP, POSINRHSCOMP
5305
& BUFR, LBUFR, LBUFR_BYTES,
5306
& MYID, SLAVEF, COMM,
5307
& N, IWCB, LIWW, POSIWCB,
5309
& IIPOOL, NBFINF, PTRICB, PTRACB, INFO,
5310
& IPOOL, LPOOL, PANEL_POS, LPANEL_POS, STEP,
5311
& FRERE, FILS, PROCNODE_STEPS, PLEFTW, KEEP,KEEP8,
5312
& PTRIST, PTRFAC, IW, LIW, A, LA, W2, MYLEAFE,
5313
& RHS, LRHS, NRHS, MTYPE,
5314
& RHSCOMP, LRHSCOMP, POSINRHSCOMP
5124
5316
IF ( INFO( 1 ) .LT. 0 ) GOTO 270
5126
5318
ELSE IF ( IERR .eq. -2 ) THEN
5128
5320
INFO(2) = LIELL * NRHS * KEEP(35) +
5129
* ( LIELL + 2 ) * KEEP(34)
5321
& ( LIELL + 2 ) * KEEP(34)
5131
5323
ELSE IF ( IERR .eq. -3 ) THEN
5133
5325
INFO(2) = LIELL * NRHS * KEEP(35) +
5134
* ( LIELL + 2 ) * KEEP(34)
5326
& ( LIELL + 2 ) * KEEP(34)
5137
5329
DEJA_SEND( PROCDEST ) = .TRUE.
5140
IN = FRERE( STEP( IN ) )
5141
IF ( IN .GT. 0 ) GOTO 300
5332
IN = FRERE( STEP( IN ) )
5142
5334
DO I=1,(IIPOOL-POOL_FIRST_POS)/2
5143
5335
TMP=IPOOL(POOL_FIRST_POS+I-1)
5144
5336
IPOOL(POOL_FIRST_POS+I-1)=IPOOL(IIPOOL-I)
5169
5361
END SUBROUTINE ZMUMPS_42
5170
5362
SUBROUTINE ZMUMPS_641(PANEL_SIZE, PANEL_POS,
5171
* LEN_PANEL_POS, INDICES, NPIV,
5363
& LEN_PANEL_POS, INDICES, NPIV,
5364
& NPANELS, NFRONT_OR_NASS,
5365
& NBENTRIES_ALLPANELS)
5174
INTEGER, intent (in) :: PANEL_SIZE, NPIV
5175
INTEGER, intent (in) :: INDICES(NPIV)
5176
INTEGER, intent (in) :: LEN_PANEL_POS
5177
INTEGER, intent (out):: NPANELS
5178
INTEGER, intent (out):: PANEL_POS(LEN_PANEL_POS)
5367
INTEGER, intent (in) :: PANEL_SIZE, NPIV
5368
INTEGER, intent (in) :: INDICES(NPIV)
5369
INTEGER, intent (in) :: LEN_PANEL_POS
5370
INTEGER, intent (out) :: NPANELS
5371
INTEGER, intent (out) :: PANEL_POS(LEN_PANEL_POS)
5372
INTEGER, intent (in) :: NFRONT_OR_NASS
5373
INTEGER(8), intent(out):: NBENTRIES_ALLPANELS
5179
5374
INTEGER NPANELS_MAX, I, NBeff
5375
INTEGER(8) :: NBENTRIES_THISPANEL
5376
NBENTRIES_ALLPANELS = 0_8
5180
5377
NPANELS_MAX = (NPIV+PANEL_SIZE-1)/PANEL_SIZE
5181
5378
IF (LEN_PANEL_POS .LT. NPANELS_MAX + 1) THEN
5182
WRITE(*,*) "Error in ZMUMPS_641",
5183
* LEN_PANEL_POS,NPANELS_MAX
5379
WRITE(*,*) "Error 1 in ZMUMPS_641",
5380
& LEN_PANEL_POS,NPANELS_MAX
5184
5381
CALL MUMPS_ABORT()
5230
5429
CALL MUMPS_ABORT()
5232
5431
CALL ZMUMPS_290( MYID, SIZE_ROOT, NRHS, RHS_SEQ,
5233
* LOCAL_M, LOCAL_N_RHS,
5234
* MBLOCK, NBLOCK, RHS_PAR, MASTER_ROOT,
5235
* NPROW, NPCOL, COMM )
5432
& LOCAL_M, LOCAL_N_RHS,
5433
& MBLOCK, NBLOCK, RHS_PAR, MASTER_ROOT,
5434
& NPROW, NPCOL, COMM )
5236
5435
IF ( LDLT .eq. 0 .OR. LDLT .eq. 2 ) THEN
5237
5436
IF ( MTYPE .eq. 1 ) THEN
5238
5437
CALL PZGETRS('N',SIZE_ROOT,NRHS,A,1,1,DESCA_PAR,IPIV,
5239
* RHS_PAR,1,1,DESCB_PAR,IERR)
5438
& RHS_PAR,1,1,DESCB_PAR,IERR)
5241
5440
CALL PZGETRS('T',SIZE_ROOT,NRHS,A,1,1,DESCA_PAR,IPIV,
5242
* RHS_PAR, 1, 1, DESCB_PAR,IERR)
5441
& RHS_PAR, 1, 1, DESCB_PAR,IERR)
5245
5444
CALL PZPOTRS( 'L', SIZE_ROOT, NRHS, A, 1, 1, DESCA_PAR,
5246
* RHS_PAR, 1, 1, DESCB_PAR, IERR )
5445
& RHS_PAR, 1, 1, DESCB_PAR, IERR )
5248
5447
IF ( IERR .LT. 0 ) THEN
5249
5448
WRITE(*,*) ' Problem during solve of the root'
5250
5449
CALL MUMPS_ABORT()
5252
5451
CALL ZMUMPS_156( MYID, SIZE_ROOT, NRHS,
5253
* RHS_SEQ, LOCAL_M, LOCAL_N_RHS,
5254
* MBLOCK, NBLOCK, RHS_PAR, MASTER_ROOT,
5255
* NPROW, NPCOL, COMM )
5452
& RHS_SEQ, LOCAL_M, LOCAL_N_RHS,
5453
& MBLOCK, NBLOCK, RHS_PAR, MASTER_ROOT,
5454
& NPROW, NPCOL, COMM )
5256
5455
DEALLOCATE(RHS_PAR)
5258
5457
END SUBROUTINE ZMUMPS_286