OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
cfac_root_parallel.F
Go to the documentation of this file.
1C
2C This file is part of MUMPS 5.5.1, released
3C on Tue Jul 12 13:17:24 UTC 2022
4C
5C
6C Copyright 1991-2022 CERFACS, CNRS, ENS Lyon, INP Toulouse, Inria,
7C Mumps Technologies, University of Bordeaux.
8C
9C This version of MUMPS is provided to you free of charge. It is
10C released under the CeCILL-C license
11C (see doc/CeCILL-C_V1-en.txt, doc/CeCILL-C_V1-fr.txt, and
12C https://cecill.info/licences/Licence_CeCILL-C_V1-en.html)
13C
14 SUBROUTINE cmumps_facto_root(
15 & MPA, MYID, MASTER_OF_ROOT,
16 & root, N, IROOT,
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
22 & )
24 USE cmumps_struc_def, ONLY : cmumps_root_struc
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'
51 EXTERNAL numroc
52 INTEGER numroc
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 )
61 ENDIF
62 RETURN
63 ENDIF
64.GT. IF (MPA0) THEN
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
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.EQ..OR..EQ..OR..ne. IF ( LDLT0 LDLT2 QR0 ) 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.GT. IF ( allocok 0 ) THEN
88 INFO(1) = -13
89 INFO(2) = LPIV
90 WRITE(*,*) MYID,': problem allocating ipiv(',LPIV,') in root'
91 CALL MUMPS_ABORT()
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.EQ. IF ( LDLT2 ) THEN
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
101 CALL MUMPS_ABORT()
102 END IF
103.LT. IF ( LWK min(
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.'
108 CALL MUMPS_ABORT()
109 END IF
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 )
114 END IF
115.EQ..OR..EQ. IF (LDLT0LDLT2) 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.GT. IF ( IERR 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.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 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
172 CALL MUMPS_ABORT()
173 ENDIF
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,
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 CMUMPS_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
197 END SUBROUTINE CMUMPS_FACTO_ROOT
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)
for(i8=*sizetab-1;i8 >=0;i8--)
subroutine upd_flop_root(keep50, nfront, npiv, nprow, npcol, myid)
Definition clr_stats.F:331