25 IMPLICIT NONE
26 include 'mpif.h'
27 TYPE ( CMUMPS_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 WK( LWK )
33 INTEGER KEEP(500)
34 REAL 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 A( LA )
41 DOUBLE PRECISION, intent(inout) :: OPELIW
42 INTEGER, INTENT(INOUT) :: DET_SIGN, DET_EXP
43 COMPLEX, 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 pcgetrf( 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 pcpotrf(
'L',root%TOT_ROOT_SIZE,a(iapos),
125 & 1,1,root%DESCRIPTOR(1),ierr)
126 IF ( ierr .GT. 0 ) THEN
127 info(1)=-40
128 info(2)=ierr-1
129 END IF
130 END IF
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 )
139 ENDIF
140 ELSE
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 )
148 ENDIF
149 ENDIF
150 IF ( ldlt .EQ. 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 IF (myid .eq. master_of_root) THEN
160 keep8(10)=keep8(10) +
161 & mod(entries_root, int(root%NPROW*root%NPCOL,8))
162 ENDIF
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 CMUMPS_FACTO_ROOT:",
170 & "Block size different for rows and columns",
171 & root%MBLOCK, root%NBLOCK
173 ENDIF
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 IF (keep(252) .NE. 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
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 cmumps_par_root_minmax_piv_upd(block_size, ipiv, myrow, mycol, nprow, npcol, a, local_m, local_n, n, myid, dkeep, keep, sym)
subroutine cmumps_getdeter2d(block_size, ipiv, myrow, mycol, nprow, npcol, a, local_m, local_n, n, myid, deter, nexp, sym)
subroutine cmumps_symmetrize(buf, block_size, myrow, mycol, nprow, npcol, a, local_m, local_n, n, myid, comm)
subroutine cmumps_solve_2d_bcyclic(size_root, nrhs, mtype, a, desca_par, local_m, local_n, local_n_rhs, ipiv, lpiv, rhs_par, ldlt, mblock, nblock, cntxt_par, ierr)
subroutine mumps_get_flops_cost(nfront, npiv, nass, keep50, level, cost)
subroutine mumps_update_flops_root(opeliw, keep50, nfront, npiv, nprow, npcol, myid)
subroutine pcpotrf(uplo, n, a, ia, ja, desca, info)
subroutine pcgetrf(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)