15 & MPA, MYID, MASTER_OF_ROOT,
17 & COMM, IW, LIW, IFREE,
18 & A, LA, PTRAST, PTLUST_S, PTRFAC,
19 & STEP, INFO, LDLT, QR,
20 & WK, LWK, KEEP,KEEP8,DKEEP,OPELIW,
21 & DET_EXP, DET_MANT, DET_SIGN
27 TYPE ( ZMUMPS_ROOT_STRUC ) :: root
28 INTEGER,
INTENT(IN) :: MPA
29 INTEGER N, IROOT, COMM, , MYID, IFREE, MASTER_OF_ROOT
32 COMPLEX(kind=8) WK( LWK )
34 DOUBLE PRECISION DKEEP(230)
36 INTEGER(8) :: PTRAST(KEEP(28))
37 INTEGER(8) :: PTRFAC(KEEP(28))
38 INTEGER PTLUST_S(KEEP(28)), STEP(N), IW( LIW )
39 INTEGER INFO( 2 ), LDLT, QR
40 COMPLEX(kind=8) A( LA )
41 DOUBLE PRECISION,
intent(inout) :: OPELIW
42 INTEGER,
INTENT(INOUT) :: DET_SIGN, DET_EXP
43 COMPLEX(kind=8),
INTENT(INOUT) :: DET_MANT
46 DOUBLE PRECISION :: FLOPS_ROOT
47 INTEGER(8) :: ENTRIES_ROOT
48 INTEGER LOCAL_M, LOCAL_N, LPIV, IERR, allocok
49 INTEGER FWD_LOCAL_N_RHS, FWD_MTYPE
50 include
'mumps_headers.h'
53 IF ( .NOT. root%yes )
RETURN
54 IF ( keep(60) .NE. 0 )
THEN
55 IF ((ldlt == 1 .OR. ldlt == 2) .AND. keep(60) == 3 )
THEN
57 & root%MYROW, root%MYCOL, root%NPROW, root%NPCOL,
58 & root%SCHUR_POINTER(1),
59 & root%SCHUR_LLD, root%SCHUR_NLOC,
60 & root%TOT_ROOT_SIZE, myid, comm )
65 IF (myid.EQ.master_of_root)
THEN
67 & (root%TOT_ROOT_SIZE, root%TOT_ROOT_SIZE, root%TOT_ROOT_SIZE,
68 & ldlt, 3, flops_root)
69 WRITE(mpa,
'(A, A, 1PD10.3)')
70 &
" ... Start processing the root node with ScaLAPACK, ",
71 &
" remaining flops = ", flops_root
74 ioldps = ptlust_s(step(iroot))+keep(ixsz)
75 iapos = ptrast(step(iroot))
76 local_m = iw( ioldps + 2 )
77 local_n = iw( ioldps + 1 )
78 iapos = ptrfac(iw( ioldps + 4 ))
79 IF ( ldlt.EQ.0 .OR. ldlt.EQ.2 .OR. qr.ne.0 )
THEN
80 lpiv = local_m + root%MBLOCK
84 IF (
associated( root%IPIV ))
DEALLOCATE(root%IPIV)
86 ALLOCATE( root%IPIV( lpiv ), stat = allocok )
87 IF ( allocok .GT. 0 )
THEN
90 WRITE(*,*) myid,
': problem allocating IPIV(',lpiv,
') in root'
93 CALL descinit( root%DESCRIPTOR(1), root%TOT_ROOT_SIZE,
94 & root%TOT_ROOT_SIZE, root%MBLOCK, root%NBLOCK,
95 & 0, 0, root%CNTXT_BLACS, local_m, ierr )
97 IF(root%MBLOCK.NE.root%NBLOCK)
THEN
98 WRITE(*,*)
' Error: symmetrization only works for'
99 WRITE(*,*)
' square block sizes, MBLOCK/NBLOCK=',
100 & root%MBLOCK, root%NBLOCK
104 & int(root%MBLOCK,8) * int(root%NBLOCK,8),
105 & int(root%TOT_ROOT_SIZE,8)* int(root%TOT_ROOT_SIZE,8 )
107 WRITE(*,*)
'Not enough workspace for symmetrization.'
111 & root%MYROW, root%MYCOL, root%NPROW, root%NPCOL,
112 & a( iapos ), local_m, local_n,
113 & root%TOT_ROOT_SIZE, myid, comm )
115 IF (ldlt.EQ.0.OR.ldlt.EQ.2)
THEN
116 CALL pzgetrf( root%TOT_ROOT_SIZE, root%TOT_ROOT_SIZE,
118 & 1, 1, root%DESCRIPTOR(1), root%IPIV(1), ierr )
119 IF ( ierr .GT. 0 )
THEN
124 CALL pzpotrf(
'L',root%TOT_ROOT_SIZE,a(iapos),
125 & 1,1,root%DESCRIPTOR(1),ierr)
126 IF ( ierr .GT. 0 )
THEN
131 IF (ierr .GT. 0)
THEN
133 & root%TOT_ROOT_SIZE, info(2),
134 & root%NPROW, root%NPCOL, myid )
135 IF (keep(486) .GT. 0)
THEN
137 & root%TOT_ROOT_SIZE, info(2),
138 & root%NPROW, root%NPCOL, myid )
142 & root%TOT_ROOT_SIZE, root%TOT_ROOT_SIZE,
143 & root%NPROW, root%NPCOL, myid )
144 IF (keep(486) .GT. 0)
THEN
146 & root%TOT_ROOT_SIZE, root%TOT_ROOT_SIZE,
147 & root%NPROW, root%NPCOL, myid )
150 IF ( ldlt .EQ. 0 )
THEN
151 entries_root = int(root%TOT_ROOT_SIZE,8)
152 & * int(root%TOT_ROOT_SIZE,8)
154 entries_root = int(root%TOT_ROOT_SIZE,8)
155 & * int(root%TOT_ROOT_SIZE+1,8)/2_8
157 keep8(10)=keep8(10) + entries_root /
158 & int(root%NPROW * root%NPCOL,8)
159 IF (myid .eq. master_of_root)
THEN
160 keep8(10)=keep8(10) +
161 & mod(entries_root, int(root%NPROW*root%NPCOL,8))
164 & root%MBLOCK, root%IPIV(1),root%MYROW,
165 & root%MYCOL, root%NPROW, root%NPCOL, a(iapos), local_m,
166 & local_n, root%TOT_ROOT_SIZE, myid, dkeep, keep, ldlt)
167 IF (keep(258).NE.0)
THEN
168 IF (root%MBLOCK.NE.root%NBLOCK)
THEN
169 write(*,*)
"Internal error in ZMUMPS_FACTO_ROOT:",
170 &
"Block size different for rows and columns",
171 & root%MBLOCK, root%NBLOCK
175 & root%MYCOL, root%NPROW
179 IF (keep(252) .NE. 0)
THEN
181 & root%MYCOL, 0, root%NPCOL)
182 fwd_local_n_rhs =
max(1,fwd_local_n_rhs)
185 & root%TOT_ROOT_SIZE,
189 & root%DESCRIPTOR(1),
190 & local_m, local_n, fwd_local_n_rhs,
191 & root%IPIV(1), lpiv,
192 & root%RHS_ROOT(1,1), ldlt,
193 & root%MBLOCK, root%NBLOCK,
194 & root%CNTXT_BLACS, ierr)
subroutine zmumps_facto_root(mpa, myid, master_of_root, root, n, iroot, comm, iw, liw, ifree, a, la, ptrast, ptlust_s, ptrfac, step, info, ldlt, qr, wk, lwk, keep, keep8, dkeep, opeliw, det_exp, det_mant, det_sign)