OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
zfac_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 zmumps_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 zmumps_struc_def, ONLY : zmumps_root_struc
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'
51 EXTERNAL numroc
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
56 CALL zmumps_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 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'
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 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
101 CALL mumps_abort()
102 END IF
103 IF ( lwk .LT. 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 zmumps_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 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 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
132 CALL mumps_update_flops_root( opeliw, ldlt,
133 & root%TOT_ROOT_SIZE, info(2),
134 & root%NPROW, root%NPCOL, myid )
135 IF (keep(486) .GT. 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 IF (keep(486) .GT. 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 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 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 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
197 END SUBROUTINE zmumps_facto_root
#define mumps_abort
Definition VE_Metis.h:25
subroutine mumps_get_flops_cost(nfront, npiv, nass, keep50, level, cost)
Definition estim_flops.F:74
subroutine mumps_update_flops_root(opeliw, keep50, nfront, npiv, nprow, npcol, myid)
Definition estim_flops.F:61
#define min(a, b)
Definition macros.h:20
#define max(a, b)
Definition macros.h:21
subroutine pzpotrf(uplo, n, a, ia, ja, desca, info)
Definition mpi.f:834
subroutine pzgetrf(m, n, a, ia, ja, desca, ipiv, info)
Definition mpi.f:846
subroutine descinit(desc, m, n, mb, nb, irsrc, icsrc, ictxt, lld, info)
Definition mpi.f:777
integer function numroc(n, nb, iproc, isrcproc, nprocs)
Definition mpi.f:786
subroutine upd_flop_root(keep50, nfront, npiv, nprow, npcol, myid)
Definition zlr_stats.F:331
subroutine zmumps_getdeter2d(block_size, ipiv, myrow, mycol, nprow, npcol, a, local_m, local_n, n, myid, deter, nexp, sym)
subroutine zmumps_par_root_minmax_piv_upd(block_size, ipiv, myrow, mycol, nprow, npcol, a, local_m, local_n, n, myid, dkeep, keep, sym)
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)
subroutine zmumps_symmetrize(buf, block_size, myrow, mycol, nprow, npcol, a, local_m, local_n, n, myid, comm)
subroutine zmumps_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)