357 &(idrhs, idinfo, idn, idnrhs, idlrhs)
358 DOUBLE PRECISION,
DIMENSION(:),
POINTER :: idRHS
359 INTEGER,
intent(in) :: idN, idNRHS, idLRHS
360 INTEGER,
intent(inout) :: idINFO(:)
364 TYPE (dmumps_struc),
TARGET ::
id
368 TYPE (DMUMPS_STRUC),
TARGET :: id
372 TYPE (DMUMPS_STRUC),
TARGET ::
376 TYPE (),
TARGET,
INTENT(IN) :: id
384 parameter( master = 0 )
390 TYPE (dmumps_struc) ::
id
583 INTEGER JOBMIN, JOBMAX, OLDJOB
585 INTEGER I, J, MP, LP, MPG, KEEP235SAVE, KEEP242SAVE,
586 & KEEP243SAVE, KEEP495SAVE, KEEP497SAVE
588 LOGICAL LANA, LFACTO, LSOLVE, PROK, LPOK, FLAG, PROKG
589 LOGICAL NOERRORBEFOREPERM
590 LOGICAL UNS_PERM_DONE,I_AM_SLAVE
595 CHARACTER(LEN=20) :: FROM_C_INTERFACE_STRING
596 INTEGER,
PARAMETER :: ICNTL18DIST_MIN = 1
597 INTEGER,
PARAMETER :: ICNTL18DIST_MAX = 3
598 INTEGER,
DIMENSION(:),
ALLOCATABLE :: UNS_PERM_INV
600 DOUBLE PRECISION TIMEG, TIMETOTAL
601 INTEGER(8) :: ,STRUC_SIZE
602 INTEGER:: ICNTL16_LOC
604 IF (
id%JOB .EQ. -200)
THEN
619 noerrorbeforeperm = .false.
620 uns_perm_done = .false.
633 IF ( .NOT. flag )
THEN
637 990
FORMAT(
' Unrecoverable Error in DMUMPS initialization: ',
638 &
' MPI is not running.')
665 IF ( jobmin .NE. jobmax )
THEN
673 IF ((job.LT.-3.OR.job.EQ.0.OR.job.GT.8)
685 oldjob =
id%KEEP( 40 ) + 456789
686 IF (oldjob.NE.-1.AND.oldjob.NE.-2.AND.
687 & oldjob.NE.1.AND.oldjob.NE.2.AND.
696 IF((job.GT.-2).AND.(
id%KEEP(140).EQ.1))
then
710 IF ((job.EQ.1).OR.(job.EQ.4).OR.
711 & (job.EQ.6)) lana = .true.
712 IF ((job.EQ.2).OR.(job.EQ.4).OR.
713 & (job.EQ.5).OR.(job.EQ.6)) lfacto = .true.
714 IF ((job.EQ.3).OR.(job.EQ.5).OR.
715 & (job.EQ.6)) lsolve = .true.
716 IF ( lana .OR. lfacto .OR. lsolve)
THEN
719 CALL mpi_bcast(
id%KEEP(370), 2, mpi_integer, master,
id%COMM,
722 CALL mpi_bcast(
id%KEEP(198), 1, mpi_integer, master,
724 IF (
id%KEEP(370) .EQ. 1)
THEN
730 IF (
id%KEEP(371) .EQ. 1)
THEN
732 IF (
id%KEEP(50) .EQ. 0 .AND.
id%NSLAVES .GE. 32)
THEN
745 IF (
id%KEEP(198).NE.0)
THEN
749 IF ((
id%KEEP(50).EQ.0) .AND. (
id%NSLAVES.GT.1))
THEN
752 IF (
id%KEEP(198).EQ.2)
THEN
767 IF (lana .OR. lfacto)
THEN
774 IF (job.EQ.-2.OR.job.EQ.1.OR.job.EQ.2.OR.job.EQ.3.OR.
775 & job.EQ.4.OR.job.EQ.5.OR.job.EQ.6
776 & .OR.job.EQ.7.OR.job.EQ.8.OR.job.EQ.-3
784 lpok = ((lp.GT.0).AND.(
id%ICNTL(4).GE.1))
785 prok = ((mp.GT.0).AND.(
id%ICNTL(4).GE.2))
786 prokg = ( mpg .GT. 0 .and.
id%MYID .eq. master )
787 prokg = (prokg.AND.(
id%ICNTL(4).GE.2))
788 IF (
id%KEEP(500).EQ.1)
THEN
789 from_c_interface_string=
" from C interface"
791 from_c_interface_string=
" "
796 icntl16_loc =
id%ICNTL(16)
797 CALL mpi_bcast( icntl16_loc, 1, mpi_integer, master,
id%COMM,
801#if defined(WORKAROUNDINTELILP64OPENMPLIMITATION)
825 WRITE(mpg,
'(/A,A,A,A,I4)')
826 &
'Entering DMUMPS ',
827 & trim(adjustl(
id%VERSION_NUMBER)),
828 & trim(from_c_interface_string),
830 ELSE IF (
id%ICNTL(5) .NE. 1)
THEN
832 IF (
id%ICNTL(18) .EQ. 0
834 WRITE(mpg,
'(/A,A,A,A,I4,I12,I15)')
835 &
'Entering DMUMPS ',
836 & trim(adjustl(
id%VERSION_NUMBER)),
837 & trim(from_c_interface_string),
838 &
' with JOB, N, NNZ =', job,
id%N,
id%KEEP8(28)
840 WRITE(mpg,
'(/A,A,A,A,I4,I12)')
841 &
'Entering DMUMPS ',
842 & trim(adjustl(
id%VERSION_NUMBER)),
843 & trim(from_c_interface_string),
844 &
' with JOB, N =', job,
id%N
848 WRITE(mpg,
'(/A,A,A,A,I4,I12,I15)')
849 &
'Entering DMUMPS ',
850 & trim(adjustl(
id%VERSION_NUMBER)),
851 & trim(from_c_interface_string),
852 &
' driver with JOB, N, NELT =', job,
id%N,
id%NELT
857!$ &
id%NPROCS,
' and #OMP = ', nomp
864 WRITE(mpg,
'(A,I6,A)')
' executing #MPI = ',
865 &
id%NPROCS
', without OMP'
867 IF (job.GE.1 .AND. job.LE.6)
THEN
868 IF (
id%KEEP(370).EQ.1.OR.
id%KEEP(371).EQ.1)
THEN
869 WRITE(mpg, 99996)
id%KEEP(370),
id%KEEP(371)
87199996
FORMAT(/
'Advanced settings:'/
872 &
' KEEP(370) Static mapping =',i4/
873 &
' KEEP(371) Advanced optimizations =',i4)
874 IF (
id%KEEP(401) .EQ.1)
THEN
875 WRITE(mpg, 99997)
id%KEEP(401)
87799997
FORMAT(
'L0 thread based multithreading setting:'/
878 &
' KEEP(401) (0=OFF, 1=ON) =',i4)
892 IF ( job .EQ. -1 )
THEN
901 oldjob =
id%KEEP( 40 ) + 456789
902 IF ( oldjob .EQ. 1 .OR.
904 & oldjob .EQ. 3 )
THEN
918 IF (
id%INFO(1) .LT. 0 )
THEN
932 IF (
id%KEEP(201).GT.0)
THEN
946 IF (
id%INFO(1) .LT. 0 )
GOTO 499
949 IF ( job .EQ. -2 )
THEN
953 id%KEEP(40)= -2 - 456789
961 IF (
id%MYID.EQ.master)
THEN
973 IF ( job .EQ. 7 .OR. job .EQ. 8 )
THEN
974 IF( job.EQ.8 .AND. oldjob.NE.-1)
THEN
979 IF (
id%MYID.EQ.master)
THEN
984 IF ( (
id%KEEP(46).EQ.0).AND.(
id%NPROCS.LE.1) )
987 id%INFO(2) =
id%NPROCS
993 IF (
id%INFO(1) .LT. 0 )
GOTO 499
994 IF ( job .EQ. 7 )
THEN
995 IF (
id%MYID.EQ.master)
THEN
999 IF (
id%MYID.EQ.master)
THEN
1002 WRITE( mpg,
'(/A,F12.4)')
1003 &
' Elapsed time in save structure driver= ', timeg
1007 IF (
id%MYID.EQ.master)
THEN
1011 IF (
id%MYID.EQ.master)
THEN
1014 WRITE( mpg,
'(/A,F12.4)')
1015 &
' Elapsed time in restore structure driver= '
1020 IF (
id%INFO(1) .LT. 0 )
GOTO 499
1030 IF (job .EQ. -3)
THEN
1032 IF (
id%INFO(1) .LT. 0 )
GOTO 499
1037 IF ( oldjob .LT. 2 )
THEN
1043 IF (
id%INFO(1) .LT. 0 )
GOTO 499
1054 IF (
id%MYID.EQ.master)
THEN
1059 IF ( (
id%KEEP(46).EQ.0).AND.(
id%NPROCS.LE.1) )
1062 id%INFO(2) =
id%NPROCS
1069 &
id%COMM,
id%MYID )
1070 IF (
id%INFO(1) .LT. 0 )
GOTO 499
1081 IF ( prokg .AND. oldjob .EQ. -1 )
THEN
1089 IF ( oldjob .EQ. 0 .OR. oldjob .GT. 3 .OR. oldjob .LT. -1 )
THEN
1094 IF ( oldjob .GE. 2 )
THEN
1100 IF (
associated(
id%IS))
THEN
1104 IF (
associated(
id%S))
THEN
1115 IF ( oldjob .LT. 1 .and. .NOT. lana )
THEN
1126 IF ( oldjob .LT. 2 .AND. .NOT. lfacto )
THEN
1138#if ! defined (LARGEMATRICES)
1139 noerrorbeforeperm =.true.
1140 uns_perm_done=.false.
1141 IF (
id%MYID .eq. master .AND.
id%KEEP(23) .NE. 0)
THEN
1142 IF (
id%JOB .EQ. 2 .OR.
id%JOB .EQ. 5 .OR.
1143 & (
id%JOB .EQ. 3 .AND. (
id%ICNTL(10) .NE.0 .OR.
1144 &
id%ICNTL(11).NE. 0)))
THEN
1145 uns_perm_done = .true.
1146 ALLOCATE(uns_perm_inv(
id%N),stat=ierr)
1147 IF (ierr .GT. 0)
THEN
1157 IF (lpok)
WRITE(lp,99993)
1161 uns_perm_inv(
id%UNS_PERM(i))=i
1163 DO i8 = 1_8,
id%KEEP8(28)
1166 IF (j.LE.0.OR.j.GT.
id%N) cycle
1167 id%JCN(i8)=uns_perm_inv(j)
1169 DEALLOCATE(uns_perm_inv)
1177 &
id%COMM,
id%MYID )
1178 IF (
id%INFO( 1 ) .LT. 0 )
GO TO 499
1211 id%KEEP(40)=-1 -456789
1213 IF (
id%MYID.EQ.master)
THEN
1215 IF ((
id%N.LE.0).OR.((
id%N+
id%N+
id%N)/3.NE.
id%N))
THEN
1220 IF (
id%ICNTL(5).NE.1)
THEN
1222 IF (
id%ICNTL(18) .LT. 1 .OR.
id%ICNTL(18) .GT. 3)
THEN
1224 IF (
id%KEEP8(28) .LE. 0_8)
THEN
1232 IF (
id%NELT .LE. 0)
THEN
1234 id%INFO(2) =
id%NELT
1246 IF (
id%ICNTL(5) .EQ. 1 )
THEN
1247 IF (
associated(
id%ELTPROC ) )
1248 &
DEALLOCATE(
id%ELTPROC )
1249 ALLOCATE(
id%ELTPROC(
id%NELT), stat=ierr )
1252 id%INFO(2) =
id%NELT
1253 IF ( lpok )
WRITE(lp,
'(A)')
1254 &
'Problem in allocating work array ELTPROC'
1263 IF (
id%ICNTL(5) .NE. 1 )
THEN
1265 IF (
id%ICNTL(18) .LT. icntl18dist_min
1266 & .OR.
id%ICNTL(18) .GT. icntl18dist_max )
THEN
1267 IF ( .not.
associated(
id%IRN ) )
THEN
1270#if defined(MUMPS_F2003)
1271 ELSE IF (
size(
id%IRN, kind=8 ) <
id%KEEP8(28) )
THEN
1276 ELSE IF (
id%KEEP8(28) .LE. int(huge(
id%NZ),8) .AND.
1277 &
size(
id%IRN) < int(
id%KEEP8(28)) )
THEN
1281 ELSE IF ( .not.
associated(
id%JCN ) )
THEN
1284#if defined(MUMPS_F2003)
1285 ELSE IF (
size(
id%JCN, kind=8 ) <
id%KEEP8(28) )
THEN
1288 ELSE IF (
id%KEEP8(28) .LE. int(huge(
id%NZ),8) .AND.
1289 &
size(
id%JCN) < int(
id%KEEP8(28)) )
THEN
1295 IF (
id%INFO( 1 ) .eq. -22 )
THEN
1296 IF ( lpok )
WRITE(lp,
'(A)')
1297 &
'Error in analysis: IRN/JCN badly allocated.'
1300 IF ( .not.
associated(
id%ELTPTR ) )
THEN
1303 ELSE IF (
size(
id%ELTPTR ) <
id%NELT+1 )
THEN
1306 ELSE IF ( .not.
associated(
id%ELTVAR ) )
THEN
1310 id%LELTVAR =
id%ELTPTR(
id%NELT+1 ) - 1
1311 IF (
size(
id%ELTVAR ) <
id%LELTVAR )
THEN
1322 j =
id%ELTPTR(i+1) -
id%ELTPTR(i)
1323 id%KEEP8(30) =
id%KEEP8(30) + int(j,8) * int(j,8)
1328 j =
id%ELTPTR(i+1) -
id%ELTPTR(i)
1329 id%KEEP8(30) =
id%KEEP8(30) +
1330 & (int(j,8) *int(j+1,8))/2_8
1335 IF (
id%INFO( 1 ) .eq. -22 )
THEN
1336 IF ( lpok )
WRITE(lp,'(a)
')
1337 & 'error in analysis: eltptr/eltvar badly allocated.
'
1344 CALL MUMPS_PROPINFO( id%ICNTL(1),
1346 & id%COMM, id%MYID )
1347.LT.
IF ( id%INFO( 1 ) 0 ) GO TO 499
1351.eq.
IF (id%MYID MASTER) THEN
1353 CALL MUMPS_SECDEB(TIMEG)
1359.EQ.
IF (id%MYIDMASTER) THEN
1361 id%KEEP(52) = id%ICNTL(8)
1363.GT..OR..LT.
IF ( id%KEEP(52) 8 id%KEEP(52)-2)
1365.EQ..OR..EQ.
IF ( id%KEEP(52) 2 id%KEEP(52)5
1366.OR..EQ.
& id%KEEP(52) 6 )
1368.EQ..AND..EQ.
IF ((id%KEEP(52)77)(id%KEEP(50)1)) THEN
1369 ! for SPD matrices default is no scaling
1372.EQ..OR..LE.
IF ( id%KEEP(52)77 id%KEEP(52)-2) THEN
1375.not.
IF (associated(id%A)) id%KEEP(52) = 0
1378.EQ.
IF(id%KEEP(52) -1) id%KEEP(52) = 0
1382.EQ.
IF (id%ICNTL(6)0) id%KEEP(52) = 0
1384.EQ.
IF (id%KEEP(50)1) id%KEEP(52) = 0
1386.EQ.
IF (id%KEEP(52)-2) THEN
1394 IF ( associated(id%COLSCA)) THEN
1395 DEALLOCATE( id%COLSCA )
1398 IF ( associated(id%ROWSCA)) THEN
1399 DEALLOCATE( id%ROWSCA )
1408 CALL DMUMPS_ANA_DRIVER( id )
1411.eq.
IF (id%MYID MASTER) THEN
1413.EQ.
IF (id%KEEP(52)0) id%INFOG(33)=id%ICNTL(8)
1414.EQ.
IF (id%KEEP(52)-2) THEN
1416.not..OR.
IF (associated(id%COLSCA)
1417.not.
& associated(id%ROWSCA)
1424.GT.
IF ( MPG 0 ) THEN
1426 & ' warning; scaling was not computed during analysis
'
1428 IF ( associated(id%COLSCA)) THEN
1429 DEALLOCATE( id%COLSCA )
1432 IF ( associated(id%ROWSCA)) THEN
1433 DEALLOCATE( id%ROWSCA )
1438.NE.
IF (id%KEEP(52) 0) THEN
1439 id%INFOG(33)=id%KEEP(52)
1445.eq.
IF (id%MYID MASTER) id%INFOG(24)=id%KEEP(95)
1447.eq.
IF (id%MYID MASTER) THEN
1448 CALL MUMPS_SECFIN(TIMEG)
1449 id%DKEEP(71) = TIMEG
1452 WRITE( MPG,'(/a,f12.4)
')
1453 & ' elapsed time in analysis driver=
', TIMEG
1458.LT.
IF ( id%INFO( 1 ) 0 ) GO TO 499
1459 id%KEEP(40) = 1 -456789
1470.eq.
IF (id%MYID MASTER) THEN
1472 CALL MUMPS_SECDEB(TIMEG)
1478 id%KEEP(40) = 1 - 456789
1488 CALL MPI_BCAST( id%KEEP(125), 1, MPI_INTEGER, MASTER, id%COMM,
1490.EQ.
IF ( id%MYID MASTER ) THEN
1495.EQ.
IF (id%KEEP(60)1) THEN
1496 IF ( associated( id%SCHUR_CINTERFACE)) THEN
1504 CALL DMUMPS_SET_TMP_PTR(id%SCHUR_CINTERFACE(1),
1505 & int(id%SIZE_SCHUR,8)*int(id%SIZE_SCHUR,8))
1506 CALL DMUMPS_GET_TMP_PTR(id%SCHUR)
1507 NULLIFY(id%SCHUR_CINTERFACE)
1509.NOT.
IF ( associated (id%SCHUR)) THEN
1512 & ' schur not associated
'
1515.LT.
ELSE IF ( size(id%SCHUR)
1516 & id%SIZE_SCHUR * id%SIZE_SCHUR ) THEN
1519 & ' schur
allocated but too small
'
1528.EQ.
IF ( id%KEEP(54) 0 ) THEN
1529.eq.
IF ( id%KEEP(55)0 ) THEN
1531.not.
IF ( associated( id%IRN ) ) THEN
1534#if defined(MUMPS_F2003)
1535 ELSE IF ( size( id%IRN, KIND=8 ) < id%KEEP8(28) ) THEN
1541.LE..AND.
ELSE IF ( id%KEEP8(28) int(huge(id%NZ),8)
1542 & size(id%IRN) < int(id%KEEP8(28)) ) THEN
1546.not.
ELSE IF ( associated( id%JCN ) ) THEN
1549#if defined(MUMPS_F2003)
1550 ELSE IF ( size( id%JCN, KIND=8 ) < id%KEEP8(28) ) THEN
1553.LE..AND.
ELSE IF ( id%KEEP8(28) int(huge(id%NZ),8)
1554 & size(id%JCN) < int(id%KEEP8(28)) ) THEN
1558.not.
ELSEIF ( associated( id%A ) ) THEN
1561#if defined(MUMPS_F2003)
1562 ELSE IF ( size( id%A, KIND=8 ) < id%KEEP8(28) ) THEN
1565.LE..AND.
ELSE IF ( id%KEEP8(28) int(huge(id%NZ),8)
1566 & size( id%A ) < int(id%KEEP8(28)) ) THEN
1573.not.
IF ( associated( id%ELTPTR ) ) THEN
1576 ELSE IF ( size( id%ELTPTR ) < id%NELT+1 ) THEN
1579.not.
ELSE IF ( associated( id%ELTVAR ) ) THEN
1582 ELSEIF ( size( id%ELTVAR ) < id%LELTVAR ) THEN
1585.not.
ELSEIF ( associated( id%A_ELT ) ) THEN
1589#if defined(MUMPS_F2003)
1590 IF ( size( id%A_ELT, KIND=8 ) < id%KEEP8(30) ) THEN
1592.AND.
IF ( id%KEEP8(30) < int(huge(id%NZ),8)
1593 & size( id%A_ELT ) < int(id%KEEP8(30)) ) THEN
1604 CALL MUMPS_GET_PERLU(id%KEEP(12),id%ICNTL(14),
1605 & id%KEEP(50),id%KEEP(54),id%ICNTL(6),id%ICNTL(8))
1611 CALL DMUMPS_GET_NS_OPTIONS_FACTO(id%N,id%KEEP(1),
1616.NOT..EQ..AND..EQ.
IF ( ((id%KEEP(52)-2)(id%ICNTL(8)77)) )
1620 id%KEEP(52)=id%ICNTL(8)
1622.GT..OR..LT.
IF ( id%KEEP(52) 8 id%KEEP(52)-2)
1624.EQ..OR..EQ.
IF ( id%KEEP(52) 2 id%KEEP(52)5
1625.OR..EQ.
& id%KEEP(52) 6 )
1627.EQ.
IF (id%KEEP(52)77) THEN
1628.EQ.
IF (id%KEEP(50)1) THEN
1629 ! for SPD matrices the default is "no scaling"
1632.ne.
! SYM 1 the default is cheap SIMSCA
1636.NE..AND..EQ.
IF (id%KEEP(23) 0 id%ICNTL(8) -1) THEN
1637.GT.
IF ( MPG 0 ) THEN
1638 WRITE(MPG,'(a)
') ' ** warning : scaling
'
1640 & ' ** column permutation applied:
'
1642 & ' ** column scaling has to be
permuted'
1649.EQ.
IF (id%KEEP(125)0) THEN
1653.ne..and..ne.
IF ( id%KEEP(60) 0 id%KEEP(52) 0 ) THEN
1655.GT..AND..NE.
IF ( MPG 0 id%ICNTL(8) 0 ) THEN
1656 WRITE(MPG,'(a)
') ' ** warning: scaling not applied.
'
1657 WRITE(MPG,'(a)
') ' ** (disabled with schur)
'
1666.NE..AND.
IF (id%KEEP(54) 0
1667.NE..AND..NE..AND.
& id%KEEP(52)7 id%KEEP(52)8
1668.NE.
& id%KEEP(52) 0 ) THEN
1670.GT..and..ne.
IF ( MPG 0 id%ICNTL(8) 0 ) THEN
1672 & ' ** warning: requested scaling option not available
'
1673 WRITE(MPG,'(a)
') ' **
for distributed matrix entry
'
1682.NE.
IF ( id%KEEP(50) 0 ) THEN
1683.ne..and.
IF ( id%KEEP(52) 1
1684.ne..and.
& id%KEEP(52) -1
1685.ne..and.
& id%KEEP(52) 0
1686.ne..and.
& id%KEEP(52) 7
1687.ne..and.
& id%KEEP(52) 8
1688.ne..and.
& id%KEEP(52) -2
1689.ne.
& id%KEEP(52) 77) THEN
1690.GT.
IF ( MPG 0 ) THEN
1692 & ' ** warning: scaling option n.a.
for symmetric matrix
'
1701.NE..AND.
IF (id%KEEP(55) 0
1702.gt.
& ( id%KEEP(52) 0 ) ) THEN
1704.GT.
IF ( MPG 0 ) THEN
1705 WRITE(MPG,'(a)
') ' ** warning: scaling not applied.
'
1707 & ' ** (only user scaling av.
for elt. entry)
'
1713.eq.
IF ( id%KEEP(52) -1 ) THEN
1714.not.
IF ( associated( id%ROWSCA ) ) THEN
1717 ELSE IF ( size( id%ROWSCA ) < id%N ) THEN
1720.not.
ELSE IF ( associated( id%COLSCA ) ) THEN
1723 ELSE IF ( size( id%COLSCA ) < id%N ) THEN
1740.GT..AND.
IF (id%KEEP(52)0
1741.LE.
& id%KEEP(52) 8) THEN
1742 IF ( associated(id%COLSCA))
1743 & DEALLOCATE( id%COLSCA )
1744 IF ( associated(id%ROWSCA))
1745 & DEALLOCATE( id%ROWSCA )
1746 ALLOCATE( id%COLSCA(id%N), stat=IERR)
1747.GT.
IF (IERR 0) THEN
1751 ALLOCATE( id%ROWSCA(id%N), stat=IERR)
1752.GT.
IF (IERR 0) THEN
1762.NOT.
IF ( associated(id%COLSCA)) THEN
1763 ALLOCATE( id%COLSCA(1), stat=IERR)
1765.GT.
IF (IERR 0) THEN
1769.NOT.
IF ( associated(id%ROWSCA))
1770 & ALLOCATE( id%ROWSCA(1), stat=IERR)
1771.GT.
IF (IERR 0) THEN
1774 IF ( LPOK ) WRITE(LP,'(a)
')
1775 & 'problems in allocations before facto
'
1778.EQ.
IF (id%KEEP(252) 1) THEN
1779 CALL DMUMPS_CHECK_DENSE_RHS
1780 & (id%RHS,id%INFO,id%N,id%NRHS,id%LRHS)
1782 CALL DMUMPS_SET_K221(id)
1783 CALL DMUMPS_CHECK_REDRHS(id)
1786.eq.
END IF ! End of IF (MYID MASTER)
1788 CALL MPI_BCAST( id%KEEP(221), 1, MPI_INTEGER, MASTER, id%COMM,
1792.ne..OR.
I_AM_SLAVE = ( id%MYID MASTER
1793.eq..AND.
& ( id%MYID MASTER
1794.eq.
& id%KEEP(46) 1 ) )
1796.NE..AND..GT.
& id%KEEP(54)0 id%KEEP8(29)0_8) THEN
1797.not.
IF ( associated( id%IRN_loc ) ) THEN
1800#if defined(MUMPS_F2003)
1801 ELSE IF ( size( id%IRN_loc, KIND=8 ) < id%KEEP8(29) ) THEN
1807.LE..AND.
ELSE IF ( id%KEEP8(29) int(huge(id%NZ_loc),8)
1808 & size(id%IRN_loc) < int(id%KEEP8(29)) ) THEN
1812.not.
ELSE IF ( associated( id%JCN_loc ) ) THEN
1815#if defined(MUMPS_F2003)
1816 ELSE IF ( size( id%JCN_loc, KIND=8 ) < id%KEEP8(29) ) THEN
1819.LE..AND.
ELSE IF ( id%KEEP8(29) int(huge(id%NZ_loc),8)
1820 & size(id%JCN_loc) < int(id%KEEP8(29)) ) THEN
1824.not.
ELSEIF ( associated( id%A_loc ) ) THEN
1827#if defined(MUMPS_F2003)
1828 ELSE IF ( size( id%A_loc, KIND=8 ) < id%KEEP8(29) ) THEN
1831.LE..AND.
ELSE IF ( id%KEEP8(29) int(huge(id%NZ_loc),8)
1832 & size( id%A_loc ) < int(id%KEEP8(29)) ) THEN
1842.EQ..OR..EQ.
IF (id%KEEP(60)2id%KEEP(60)3) THEN
1843 IF ( id%root%yes ) THEN
1844 IF ( associated( id%SCHUR_CINTERFACE )) THEN
1853 CALL DMUMPS_SET_TMP_PTR(id%SCHUR_CINTERFACE(1),
1854 & int(id%SCHUR_LLD,8)*int(id%root%SCHUR_NLOC-1,8)+
1855 & int(id%root%SCHUR_MLOC,8))
1856 CALL DMUMPS_GET_TMP_PTR(id%SCHUR)
1857 NULLIFY(id%SCHUR_CINTERFACE)
1860 IF (id%SCHUR_LLD < id%root%SCHUR_MLOC) THEN
1861.GT.
IF (LP0) write(LP,*)
1862 & ' schur leading dimension schur_lld
',
1863 & id%SCHUR_LLD, 'too small with respect to
',
1864 & id%root%SCHUR_MLOC
1866 id%INFO(2)=id%SCHUR_LLD
1867.NOT.
ELSE IF ( associated (id%SCHUR)) THEN
1868.GT.
IF (LP0) write(LP,'(a)
')
1869 & ' schur not associated
'
1872 ELSE IF (size(id%SCHUR) <
1873 & id%SCHUR_LLD*(id%root%SCHUR_NLOC-1)+
1874 & id%root%SCHUR_MLOC) THEN
1877 & ' schur
allocated but too small
'
1878 write(LP,*) id%MYID, ' :
Size schur=
',
1880 & ' schur_lld=
', id%SCHUR_LLD,
1881 & ' schur_mloc=
', id%root%SCHUR_NLOC,
1882 & ' schur_nloc=
', id%root%SCHUR_NLOC
1889 id%root%SCHUR_LLD=id%SCHUR_LLD
1890 IF (id%root%SCHUR_NLOC==0) THEN
1891 ALLOCATE(id%root%SCHUR_POINTER(1), stat=IERR)
1892.GT.
IF (IERR 0) THEN
1897 & 'problems in allocations before facto
'
1901 id%root%SCHUR_POINTER=>id%SCHUR
1909 CALL MUMPS_PROPINFO( id%ICNTL(1),
1911 & id%COMM, id%MYID )
1912.LT.
IF ( id%INFO(1) 0 ) GO TO 499
1916 CALL DMUMPS_FAC_DRIVER(id)
1918.eq.
IF (id%MYID MASTER) id%INFOG(33)=id%KEEP(52)
1923.EQ..OR..EQ.
IF (id%KEEP(60)2id%KEEP(60)3) THEN
1924 IF (id%root%yes) THEN
1925 IF (id%root%SCHUR_NLOC==0) THEN
1926 DEALLOCATE(id%root%SCHUR_POINTER)
1927 NULLIFY(id%root%SCHUR_POINTER)
1929 NULLIFY(id%root%SCHUR_POINTER)
1935 IF (associated(id%root%RG2L_ROW))THEN
1936 DEALLOCATE(id%root%RG2L_ROW)
1937 NULLIFY(id%root%RG2L_ROW)
1939 IF (associated(id%root%RG2L_COL))THEN
1940 DEALLOCATE(id%root%RG2L_COL)
1941 NULLIFY(id%root%RG2L_COL)
1943.eq.
IF (id%MYID MASTER) THEN
1944 CALL MUMPS_SECFIN(TIMEG)
1945 id%DKEEP(91) = TIMEG
1948 WRITE( MPG,'(/a,f12.4)
')
1949 & ' elapsed time in factorization driver=
', TIMEG
1954.LT.
IF(id%INFO(1)0) THEN
1956 if (associated(id%S)) then
1965 id%KEEP(40) = 2 - 456789
1975.eq.
IF (id%MYID MASTER) THEN
1977 CALL MUMPS_SECDEB(TIMEG)
1984 id%KEEP(40) = 2 -456789
1988.eq.
IF (id%MYID MASTER) THEN
1989 KEEP235SAVE = id%KEEP(235)
1990 KEEP242SAVE = id%KEEP(242)
1991 KEEP243SAVE = id%KEEP(243)
1992 KEEP495SAVE = id%KEEP(495)
1993 KEEP497SAVE = id%KEEP(497)
1994 ! if no permutation of RHS asked then suppress request
1995 ! to interleave the RHS
1996 ! to interleave the RHS on ordering given then
1997 ! using option to set permutation to identity should be
1998 ! used (note though that
1999 ! they # with A-1/sparseRHS and Null Space)
2000.EQ.
IF (id%KEEP(242)0) id%KEEP(243)=0
2006.ne.
IF ( id%KEEP(52) 0) THEN
2007.not.
IF ( associated( id%ROWSCA ) ) THEN
2010 ELSE IF ( size( id%ROWSCA ) < id%N ) THEN
2013.not.
ELSE IF ( associated( id%COLSCA ) ) THEN
2016 ELSE IF ( size( id%COLSCA ) < id%N ) THEN
2025 CALL MUMPS_PROPINFO( id%ICNTL(1),
2027 & id%COMM, id%MYID )
2028.LT.
IF ( id%INFO(1) 0 ) GO TO 499
2029 CALL DMUMPS_SOLVE_DRIVER(id)
2030.eq.
IF (id%MYID MASTER) THEN
2031 CALL MUMPS_SECFIN(TIMEG)
2032 id%DKEEP(111) = TIMEG
2035 WRITE( MPG,'(/a,f12.4)
')
2036 & ' elapsed time in solve driver=
', TIMEG
2038.eq.
IF (id%MYID MASTER) THEN
2039 id%KEEP(235) = KEEP235SAVE
2040 id%KEEP(242) = KEEP242SAVE
2041 id%KEEP(243) = KEEP243SAVE
2042 id%KEEP(495) = KEEP495SAVE
2043 id%KEEP(497) = KEEP497SAVE
2045.LT.
IF (id%INFO(1)0) GOTO 499
2049 id%KEEP(40) = 3 -456789
2054 IF (PROK) CALL DMUMPS_PRINT_ICNTL(id, MP)
2062 IF (LPOK) WRITE (LP,99995) id%INFO(1)
2063 IF (LPOK) WRITE (LP,99994) id%INFO(2)
2066#if ! defined(LARGEMATRICES)
2071.eq..AND..NE.
IF (id%MYID MASTER id%KEEP(23) 0
2072.AND.
& NOERRORBEFOREPERM) THEN
2079.NE..OR.
IF (id%JOB 3 UNS_PERM_DONE) THEN
2080.not.
IF (associated(id%UNS_PERM)) THEN
2092 DO I8 = 1_8, id%KEEP8(28)
2095.LE..OR..GT.
IF (J0Jid%N) CYCLE
2096 id%JCN(I8)=id%UNS_PERM(J)
2107 CALL DMUMPS_SET_INFOG(id%INFO(1), id%INFOG(1), id%COMM, id%MYID)
2113 CALL MPI_BCAST( id%RINFOG(1), 40, MPI_DOUBLE_PRECISION, MASTER,
2115.GE..AND..NE.
IF (id%INFOG(1)0 JOB-1
2116.AND..NE.
& JOB-2 ) THEN
2117.eq.
IF (id%MYID MASTER) THEN
2118 CALL MUMPS_SECFIN(TIMETOTAL)
2119 id%DKEEP(70) = TIMETOTAL
2125.GE.
IF (id%INFOG(1)0) THEN
2126 CALL DMUMPS_COMPUTE_MEMORY_SAVE(id,FILE_SIZE,STRUC_SIZE)
2127 id%KEEP8(55)=FILE_SIZE
2128 call MPI_ALLREDUCE(id%KEEP8(55),id%KEEP8(57),1,
2129 & MPI_INTEGER8, MPI_SUM,id%COMM,IERR)
2130 id%KEEP8(56)=STRUC_SIZE
2131 call MPI_ALLREDUCE(id%KEEP8(56),id%KEEP8(58),1,
2132 & MPI_INTEGER8, MPI_SUM,id%COMM,IERR)
2133 id%RINFO(7)=dble(id%KEEP8(55))/1D6
2134 id%RINFO(8)=dble(id%KEEP8(56))/1D6
2135 id%RINFOG(17)=dble(id%KEEP8(57))/1D6
2136 id%RINFOG(18)=dble(id%KEEP8(58))/1D6
2138.GT.
!$ IF (ICNTL16_LOC 0) THEN
2139#if defined(WORKAROUNDINTELILP64OPENMPLIMITATION)
2140!$ CALL omp_set_num_threads(int(PREVIOUS_OMP_THREADS_NUM,4))
2142!$ CALL omp_set_num_threads(PREVIOUS_OMP_THREADS_NUM)
2149.EQ..and..GT..and.
IF (id%MYIDMASTERMPG0
2150.lt.
& id%INFOG(1)0) THEN
2151 WRITE(MPG,'(a,i16)
') ' on
return from
dmumps, infog(1)=
',
2153 WRITE(MPG,'(a,i16)
') ' on
return from
dmumps, infog(2)=
',
2159 CALL MPI_COMM_FREE( id%COMM, IERR )
216399995 FORMAT (' ** error
RETURN ** from
dmumps info(1)=
', I5)
216499994 FORMAT (' ** info(2)=
', I16)
216599993 FORMAT (' ** allocation error: could not permute jcn.
')
2231 SUBROUTINE DMUMPS_PRINT_ICNTL (id, LP)
2232 USE DMUMPS_STRUC_DEF
2240 TYPE (DMUMPS_STRUC), TARGET, INTENT(IN) :: id
2243 INTEGER, POINTER :: JOB
2244 INTEGER,DIMENSION(:),POINTER::ICNTL
2245 DOUBLE PRECISION, DIMENSION(:),POINTER::CNTL
2247 PARAMETER( MASTER = 0 )
2252.EQ.
IF (id%MYIDMASTER) THEN
2256 WRITE (LP,990) ICNTL(1),ICNTL(2),ICNTL(3),ICNTL(4)
2257.EQ.
IF (id%SYM2) THEN
2258 WRITE (LP,991) ICNTL(5),ICNTL(6),ICNTL(7),ICNTL(12),
2261 & ICNTL(18),ICNTL(19),ICNTL(22),ICNTL(58)
2263 WRITE (LP,891) ICNTL(5),ICNTL(6),ICNTL(7),
2266 & ICNTL(18),ICNTL(19),ICNTL(22),ICNTL(58)
2268.EQ..OR..EQ..OR.
IF ((ICNTL(6)5)(ICNTL(6)6)
2269.NE.
& (ICNTL(12)1) ) THEN
2270 WRITE (LP,992) ICNTL(8)
2272.NE.
IF (id%ICNTL(19)0)
2273 & WRITE(LP,998) id%SIZE_SCHUR
2274 WRITE (LP,993) ICNTL(14)
2277 WRITE (LP,981) CNTL(1), CNTL(3), CNTL(4), CNTL(5), CNTL(7)
2278 WRITE (LP,990) ICNTL(1),ICNTL(2),ICNTL(3),ICNTL(4)
2279 WRITE (LP,992) ICNTL(8)
2280 WRITE (LP,993) ICNTL(14)
2281 WRITE (LP,923) ICNTL(24), ICNTL(31), ICNTL(32), ICNTL(33),
2282 & ICNTL(35), ICNTL(36)
2285 WRITE (LP,990) ICNTL(1),ICNTL(2),ICNTL(3),ICNTL(4)
2287 & ICNTL(9),ICNTL(10),ICNTL(11),ICNTL(20),ICNTL(21)
2290 WRITE (LP,981) CNTL(1), CNTL(3), CNTL(4), CNTL(5), CNTL(7)
2291 WRITE (LP,990) ICNTL(1),ICNTL(2),ICNTL(3),ICNTL(4)
2292 WRITE (LP,992) ICNTL(8)
2293.NE.
IF (id%ICNTL(19)0)
2294 & WRITE(LP,998) id%SIZE_SCHUR
2295 WRITE (LP,993) ICNTL(14)
2296 WRITE (LP,923) ICNTL(24), ICNTL(31), ICNTL(32), ICNTL(33),
2297 & ICNTL(35), ICNTL(36)
2300 WRITE (LP,981) CNTL(1), CNTL(3), CNTL(4), CNTL(5), CNTL(7)
2301 WRITE (LP,990) ICNTL(1),ICNTL(2),ICNTL(3),ICNTL(4)
2302.EQ.
IF (id%SYM2) THEN
2303 WRITE (LP,991) ICNTL(5),ICNTL(6),ICNTL(7),ICNTL(12),
2306 & ICNTL(18),ICNTL(19),ICNTL(22),ICNTL(58)
2308 WRITE (LP,891) ICNTL(5),ICNTL(6),ICNTL(7),
2311 & ICNTL(18),ICNTL(19),ICNTL(22),ICNTL(58)
2313 WRITE (LP,992) ICNTL(8)
2314 WRITE (LP,993) ICNTL(14)
2316 & ICNTL(9),ICNTL(10),ICNTL(11),ICNTL(20),ICNTL(21)
2317 WRITE (LP,923) ICNTL(24), ICNTL(31), ICNTL(32), ICNTL(33),
2318 & ICNTL(35), ICNTL(36)
2321 WRITE (LP,981) CNTL(1), CNTL(3), CNTL(4), CNTL(5), CNTL(7)
2322 WRITE (LP,990) ICNTL(1),ICNTL(2),ICNTL(3),ICNTL(4)
2323.EQ.
IF (id%SYM2) THEN
2324 WRITE (LP,991) ICNTL(5),ICNTL(6),ICNTL(7),ICNTL(12),
2327 & ICNTL(18),ICNTL(19),ICNTL(22),ICNTL(58)
2329 WRITE (LP,891) ICNTL(5),ICNTL(6),ICNTL(7),
2332 & ICNTL(18),ICNTL(19),ICNTL(22),ICNTL(58)
2334.NE.
IF (id%ICNTL(19)0)
2335 & WRITE(LP,998) id%SIZE_SCHUR
2336 WRITE (LP,992) ICNTL(8)
2338 & ICNTL(9),ICNTL(10),ICNTL(11),ICNTL(20),ICNTL(21)
2339 WRITE (LP,993) ICNTL(14)
2340 WRITE (LP,923) ICNTL(24), ICNTL(31), ICNTL(32), ICNTL(33),
2341 & ICNTL(35), ICNTL(36)
2344 980 FORMAT (/'***********control parameters(icntl)**************
'/)
2346 & ' cntl(1) threshold
for numerical pivoting =
',D16.4/
2347 & ' cntl(3) null pivot detection threshold =
',D16.4/
2348 & ' cntl(4) threshold
for static pivoting =
',D16.4/
2349 & ' cntl(5) fixation
for null pivots =
',D16.4/
2350 & ' cntl(7) dropping threshold
for blr compression =
',D16.4)
2352 & 'icntl(1) output stream
for error messages =
',I10/
2353 & 'icntl(2) output stream
for diagnostic messages =
',I10/
2354 & 'icntl(3) output stream
for global information =
',I10/
2355 & 'icntl(4) level of printing =
',I10)
2357 & 'icntl(5) matrix
format',I10/
2358 & 'icntl(6) maximum transversal( keep(23) ) =
',I10/
2359 & 'icntl(7) ordering =
',I10/
2360 & 'icntl(12) ldlt ordering strat( keep(95) ) =
',I10/
2361 & 'icntl(13) parallel root(0=on, 1=off) =
',I10/
2362 & 'icntl(15) analysis by block =
',I10/
2363 & 'icntl(18) distributed matrix( keep(54) ) =
',I10/
2364 & 'icntl(19) schur option( keep(60) 0=off,else=on ) =
',I10/
2365 & 'icntl(22) out-of-core option(0=off, >0=on) =
',I10/
2366 & 'icntl(58) symbolic factorization option =
',I10)
2368 & 'icntl(5) matrix
format ( keep(55) ) =
',I10/
2369 & 'icntl(6) maximum transversal( keep(23) ) =
',I10/
2370 & 'icntl(7) ordering =
',I10/
2371 & 'icntl(13) parallel root(0=on, 1=off) =
',I10/
2372 & 'icntl(15) analysis by block =
',I10/
2373 & 'icntl(18) distributed matrix( keep(54) ) =
',I10/
2374 & 'icntl(19) schur option( keep(60) 0=off,else=on ) =
',I10/
2375 & 'icntl(22) out-of-core option(0=off, >0=on) =
',I10/
2376 & 'icntl(58) symbolic factorization option =
',I10)
2378 & 'icntl(8) scaling strategy =
',I10)
2380 & 'icntl(24) null pivot detection(0=off) =
',I10/
2381 & 'icntl(31) discard factors(0=off, else=on) =
',I10/
2382 & 'icntl(32) forward elimination during facto(0=off)=
',I10/
2383 & 'icntl(33) compute determinant(0=off) =
',I10/
2384 & 'icntl(35) block low rank(blr, 0=off >0=on) =
',I10/
2385 & 'icntl(36) blr variant =
',I10)
2387 & 'icntl(14) percent of memory increase =
',I10)
2389 & 'icntl(9) solve a x=b(1) or a
''x = b(else) =
',I10/
2390 & 'icntl(10)
max steps iterative refinement =
',I10/
2391 & 'icntl(11) error analysis(1=all,2=some,else=off) =
',I10/
2392 & 'icntl(20) den.(0)/sparse(1,2,3)/dist.(10,11) rhs =
',I10/
2393 & 'icntl(21) gathered(0) or distributed(1) solution =
',I10)
2395 & ' Size of schur matrix(size_schur) =
',I10)
2398 SUBROUTINE DMUMPS_PRINT_KEEP(id, LP)
2399 USE DMUMPS_STRUC_DEF
2404 TYPE (DMUMPS_STRUC), TARGET, INTENT(IN) :: id
2407 INTEGER, POINTER :: JOB
2408 INTEGER,DIMENSION(:),POINTER::ICNTL, KEEP
2410 PARAMETER( MASTER = 0 )
2415.EQ.
IF (id%MYIDMASTER) THEN
2419 WRITE (LP,990) ICNTL(1),ICNTL(2),ICNTL(3),ICNTL(4)
2420 WRITE (LP,991) KEEP(55),KEEP(23),ICNTL(7),KEEP(95),
2421 & ICNTL(13),KEEP(54),KEEP(60),ICNTL(22)
2422.EQ..OR..EQ.
IF ((KEEP(23)5)(KEEP(23)6))THEN
2423 WRITE (LP,992) KEEP(52)
2425 WRITE (LP,993) KEEP(12)
2428 WRITE (LP,990) ICNTL(1),ICNTL(2),ICNTL(3),ICNTL(4)
2429.EQ.
IF (KEEP(23)0)THEN
2430 WRITE (LP,992) KEEP(52)
2432 WRITE (LP,993) KEEP(12)
2435 WRITE (LP,990) ICNTL(1),ICNTL(2),ICNTL(3),ICNTL(4)
2437 & ICNTL(9),ICNTL(10),ICNTL(11),ICNTL(20),ICNTL(21)
2440 WRITE (LP,990) ICNTL(1),ICNTL(2),ICNTL(3),ICNTL(4)
2441.NE.
IF (KEEP(23)0)THEN
2442 WRITE (LP,992) KEEP(52)
2444 WRITE (LP,991) KEEP(55),KEEP(23),ICNTL(7),KEEP(95),
2445 & ICNTL(13),KEEP(54),KEEP(60),ICNTL(22)
2447 & ICNTL(9),ICNTL(10),ICNTL(11),ICNTL(20),ICNTL(21)
2448 WRITE (LP,993) KEEP(12)
2451 WRITE (LP,990) ICNTL(1),ICNTL(2),ICNTL(3),ICNTL(4)
2452 WRITE (LP,991) KEEP(55),KEEP(23),ICNTL(7),KEEP(95),
2453 & ICNTL(13),KEEP(54),KEEP(60),ICNTL(22)
2454.EQ..OR..EQ.
IF ((KEEP(23)5)(KEEP(23)6)
2455.OR..EQ.
& (KEEP(23)7)) THEN
2456 WRITE (LP,992) KEEP(52)
2458.EQ.
IF (KEEP(23)0)THEN
2459 WRITE (LP,992) KEEP(52)
2461 WRITE (LP,993) KEEP(12)
2464 WRITE (LP,990) ICNTL(1),ICNTL(2),ICNTL(3),ICNTL(4)
2465 WRITE (LP,991) KEEP(55),KEEP(23),ICNTL(7),KEEP(95),
2466 & ICNTL(13),KEEP(54),KEEP(60),ICNTL(22)
2467.EQ..OR..EQ.
IF ((KEEP(23)5)(KEEP(23)6)
2468.OR..EQ.
& (KEEP(23)7)) THEN
2469 WRITE (LP,992) KEEP(52)
2471.EQ.
IF (KEEP(23)0)THEN
2472 WRITE (LP,992) KEEP(52)
2475 & ICNTL(9),ICNTL(10),ICNTL(11),KEEP(248),ICNTL(21)
2476 WRITE (LP,993) KEEP(12)
2479 980 FORMAT (/'******internal
VALUE of parameters(icntl/keep)****
'/)
2481 & 'icntl(1) output stream
for error messages =
',I10/
2482 & 'icntl(2) output stream
for diagnostic messages =
',I10/
2483 & 'icntl(3) output stream
for global information =
',I10/
2484 & 'icntl(4) level of printing =
',I10)
2486 & 'icntl(5) matrix
format ( keep(55) ) =
',I10/
2487 & 'icntl(6) maximum transversal( keep(23) ) =
',I10/
2488 & 'icntl(7) ordering =
',I10/
2489 & 'icntl(12) ldlt ordering strat( keep(95) ) =
',I10/
2490 & 'icntl(13) parallel root(0=on, 1=off) =
',I10/
2491 & 'icntl(18) distributed matrix( keep(54
',I10/
2492 & 'icntl(19) schur option( keep(60) 0=off,else=on ) =
',I10/
2493 & 'icntl(22) out-of-core option(0=off, >0=on) =
',I10)
2495 & 'icntl(8) scaling strategy( keep(52) ) =
',I10)
2497 & 'icntl(14) percent of memory increase( keep(12) ) =
',I10)
2499 & 'icntl(9) solve a x=b (1) or a
''x = b(else) =
',I10/
2500 & 'icntl(10)
max steps iterative refinement =
',I10/
2501 & 'icntl(11) error analysis( 0= off, else=on) =
',I10/
2502 & 'icntl(20) den.(0)/sparse(1,2,3)/dist.(10,11) rhs =
',I10/
2503 & 'icntl(21) gathered(0) or distributed(1) solution =
',I10)