25 IMPLICIT NONE
26 include 'mpif.h'
27 TYPE ( ZMUMPS_ROOT_STRUC ) :: root
28 INTEGER, INTENT(IN) :: MPA
29 INTEGER N, IROOT, COMM, LIW, MYID, IFREE, MASTER_OF_ROOT
30 INTEGER(8) :: LA
31 INTEGER(8) :: LWK
32 COMPLEX(kind=8) WK( LWK )
33 INTEGER KEEP(500)
34 DOUBLE PRECISION DKEEP(230)
35 INTEGER(8) KEEP8(150)
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
44 INTEGER IOLDPS
45 INTEGER(8) :: IAPOS
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'
52 INTEGER numroc
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 )
61 ENDIF
62 RETURN
63 ENDIF
64 IF (mpa.GT.0) THEN
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
72 ENDIF
73 ENDIF
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
81 ELSE
82 lpiv = 1
83 END IF
84 IF (associated( root%IPIV )) DEALLOCATE(root%IPIV)
85 root%LPIV = lpiv
86 ALLOCATE( root%IPIV( lpiv ), stat = allocok )
87 IF ( allocok .GT. 0 ) THEN
88 info(1) = -13
89 info(2) = lpiv
90 WRITE(*,*) myid,': problem allocating IPIV(',lpiv,') in root'
92 END IF
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 )
96 IF ( ldlt.EQ.2 ) THEN
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
102 END IF
104 & int(root%MBLOCK,8) * int(root%NBLOCK,8),
105 & int(root%TOT_ROOT_SIZE,8)* int(root%TOT_ROOT_SIZE,8 )
106 & )) THEN
107 WRITE(*,*) 'Not enough workspace for symmetrization.'
109 END IF
111 & root%MYROW, root%MYCOL, root%NPROW, root%NPCOL,
112 & a( iapos ), local_m, local_n,
113 & root%TOT_ROOT_SIZE, myid, comm )
114 END IF
115 IF (ldlt.EQ.0.OR.ldlt.EQ.2) THEN
116 CALL pzgetrf( root%TOT_ROOT_SIZE, root%TOT_ROOT_SIZE,
117 & a( iapos ),
118 & 1, 1, root%DESCRIPTOR(1), root%IPIV(1), ierr )
119 IF ( ierr .GT. 0 ) THEN
120 info(1)=-10
121 info(2)=ierr-1
122 END IF
123 ELSE
124 CALL pzpotrf('l
',root%TOT_ROOT_SIZE,A(IAPOS),
125 & 1,1,root%DESCRIPTOR(1),IERR)
126.GT. IF ( IERR 0 ) THEN
127 INFO(1)=-40
128 INFO(2)=IERR-1
129 END IF
130 END IF
131.GT. IF (IERR 0) THEN
132 CALL MUMPS_UPDATE_FLOPS_ROOT( OPELIW, LDLT,
133 & root%TOT_ROOT_SIZE, INFO(2),
134 & root%NPROW, root%NPCOL, MYID )
135.GT. IF (KEEP(486) 0) THEN
136 CALL UPD_FLOP_ROOT( LDLT,
137 & root%TOT_ROOT_SIZE, INFO(2),
138 & root%NPROW, root%NPCOL, MYID )
139 ENDIF
140 ELSE
141 CALL MUMPS_UPDATE_FLOPS_ROOT( OPELIW, LDLT,
142 & root%TOT_ROOT_SIZE, root%TOT_ROOT_SIZE,
143 & root%NPROW, root%NPCOL, MYID )
144.GT. IF (KEEP(486) 0) THEN
145 CALL UPD_FLOP_ROOT( LDLT,
146 & root%TOT_ROOT_SIZE, root%TOT_ROOT_SIZE,
147 & root%NPROW, root%NPCOL, MYID )
148 ENDIF
149 ENDIF
150.EQ. IF ( LDLT 0 ) THEN
151 ENTRIES_ROOT = int(root%TOT_ROOT_SIZE,8)
152 & * int(root%TOT_ROOT_SIZE,8)
153 ELSE
154 ENTRIES_ROOT = int(root%TOT_ROOT_SIZE,8)
155 & * int(root%TOT_ROOT_SIZE+1,8)/2_8
156 ENDIF
157 KEEP8(10)=KEEP8(10) + ENTRIES_ROOT /
158 & int(root%NPROW * root%NPCOL,8)
159.eq. IF (MYID MASTER_OF_ROOT) THEN
160 KEEP8(10)=KEEP8(10) +
161 & mod(ENTRIES_ROOT, int(root%NPROW*root%NPCOL,8))
162 ENDIF
163 CALL ZMUMPS_PAR_ROOT_MINMAX_PIV_UPD (
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.NE. IF (KEEP(258)0) THEN
168.NE. IF (root%MBLOCKroot%NBLOCK) THEN
169 write(*,*) "Internal error in ZMUMPS_FACTO_ROOT:",
170 & "Block size different for rows and columns",
171 & root%MBLOCK, root%NBLOCK
172 CALL MUMPS_ABORT()
173 ENDIF
174 CALL ZMUMPS_GETDETER2D(root%MBLOCK, root%IPIV(1),root%MYROW,
175 & root%MYCOL, root%NPROW, root%NPCOL, A(IAPOS), LOCAL_M,
176 & LOCAL_N, root%TOT_ROOT_SIZE, MYID, DET_MANT, DET_EXP,
177 & LDLT)
178 ENDIF
179.NE. IF (KEEP(252) 0) THEN
180 FWD_LOCAL_N_RHS = numroc(KEEP(253), root%NBLOCK,
181 & root%MYCOL, 0, root%NPCOL)
182 FWD_LOCAL_N_RHS = max(1,FWD_LOCAL_N_RHS)
183 FWD_MTYPE = 1
184 CALL ZMUMPS_SOLVE_2D_BCYCLIC(
185 & root%TOT_ROOT_SIZE,
186 & KEEP(253),
187 & FWD_MTYPE,
188 & A(IAPOS),
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)
195 ENDIF
196 RETURN
subroutine mumps_get_flops_cost(nfront, npiv, nass, keep50, level, cost)
subroutine pzpotrf(uplo, n, a, ia, ja, desca, info)
subroutine pzgetrf(m, n, a, ia, ja, desca, ipiv, info)
subroutine descinit(desc, m, n, mb, nb, irsrc, icsrc, ictxt, lld, info)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine upd_flop_root(keep50, nfront, npiv, nprow, npcol, myid)
subroutine zmumps_symmetrize(buf, block_size, myrow, mycol, nprow, npcol, a, local_m, local_n, n, myid, comm)