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 ( CMUMPS_ROOT_STRUC ) :: root
28 INTEGER, INTENT(IN) :: MPA
29 INTEGER N, IROOT, COMM, LIW, MYID, IFREE, MASTER_OF_ROOT
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
41 DOUBLE PRECISION, intent(inout) :: OPELIW
42 INTEGER, INTENT(INOUT) :: DET_SIGN, DET_EXP
43 COMPLEX, 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.NOT.
IF ( root%yes ) RETURN
54.NE.
IF ( KEEP(60) 0 ) THEN
55.OR..AND.
IF ((LDLT == 1 LDLT == 2) KEEP(60) == 3 ) THEN
56 CALL CMUMPS_SYMMETRIZE( WK, root%MBLOCK,
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.EQ.
IF (MYIDMASTER_OF_ROOT) THEN
66 CALL MUMPS_GET_FLOPS_COST
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.EQ..OR..EQ..OR..ne.
IF ( LDLT0 LDLT2 QR0 ) THEN
80 LPIV = LOCAL_M + root%MBLOCK
84 IF (associated( root%IPIV )) DEALLOCATE(root%IPIV)
86 ALLOCATE( root%IPIV( LPIV ), stat = allocok )
87.GT.
IF ( allocok 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.NE.
IF(root%MBLOCKroot%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.
'
110 CALL CMUMPS_SYMMETRIZE( WK, root%MBLOCK,
111 & root%MYROW, root%MYCOL, root%NPROW, root%NPCOL,
112 & A( IAPOS ), LOCAL_M, LOCAL_N,
113 & root%TOT_ROOT_SIZE, MYID, COMM )
115.EQ..OR..EQ.
IF (LDLT0LDLT2) THEN
116 CALL pcgetrf( root%TOT_ROOT_SIZE, root%TOT_ROOT_SIZE,
118 & 1, 1, root%DESCRIPTOR(1), root%IPIV(1), IERR )
119.GT.
IF ( IERR 0 ) THEN
124 CALL pcpotrf('l
',root%TOT_ROOT_SIZE,A(IAPOS),
125 & 1,1,root%DESCRIPTOR(1),IERR)
126.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 )
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 )
150.EQ.
IF ( LDLT 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.eq.
IF (MYID MASTER_OF_ROOT) THEN
160 KEEP8(10)=KEEP8(10) +
161 & mod(ENTRIES_ROOT, int(root%NPROW*root%NPCOL,8))
163 CALL CMUMPS_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 CMUMPS_FACTO_ROOT:",
170 & "Block size different for rows and columns",
171 & root%MBLOCK, root%NBLOCK
174 CALL CMUMPS_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,
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)
184 CALL CMUMPS_SOLVE_2D_BCYCLIC(
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 cmumps_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)