OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
sfac_root_parallel.F File Reference

Go to the source code of this file.

Functions/Subroutines

subroutine smumps_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)

Function/Subroutine Documentation

◆ smumps_facto_root()

subroutine smumps_facto_root ( integer, intent(in) mpa,
integer myid,
integer master_of_root,
type ( smumps_root_struc ) root,
integer n,
integer iroot,
integer comm,
integer, dimension( liw ) iw,
integer liw,
integer ifree,
real, dimension( la ) a,
integer(8) la,
integer(8), dimension(keep(28)) ptrast,
integer, dimension(keep(28)) ptlust_s,
integer(8), dimension(keep(28)) ptrfac,
integer, dimension(n) step,
integer, dimension( 2 ) info,
integer ldlt,
integer qr,
real, dimension( lwk ) wk,
integer(8) lwk,
integer, dimension(500) keep,
integer(8), dimension(150) keep8,
real, dimension(230) dkeep,
double precision, intent(inout) opeliw,
integer, intent(inout) det_exp,
real, intent(inout) det_mant,
integer, intent(inout) det_sign )

Definition at line 14 of file sfac_root_parallel.F.

24 USE smumps_struc_def, ONLY : smumps_root_struc
25 IMPLICIT NONE
26 include 'mpif.h'
27 TYPE ( SMUMPS_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 REAL 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 REAL A( LA )
41 DOUBLE PRECISION, intent(inout) :: OPELIW
42 INTEGER, INTENT(INOUT) :: DET_SIGN, DET_EXP
43 REAL, 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 smumps_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 smumps_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 psgetrf( 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 pspotrf('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 SMUMPS_FACTO_ROOT:",
170 & "Block size different for rows and columns",
171 & root%MBLOCK, root%NBLOCK
172 CALL mumps_abort()
173 ENDIF
174 CALL smumps_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
#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 pspotrf(uplo, n, a, ia, ja, desca, info)
Definition mpi.f:870
subroutine psgetrf(m, n, a, ia, ja, desca, ipiv, info)
Definition mpi.f:881
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 slr_stats.F:331
subroutine smumps_par_root_minmax_piv_upd(block_size, ipiv, myrow, mycol, nprow, npcol, a, local_m, local_n, n, myid, dkeep, keep, sym)
subroutine smumps_getdeter2d(block_size, ipiv, myrow, mycol, nprow, npcol, a, local_m, local_n, n, myid, deter, nexp, sym)
subroutine smumps_symmetrize(buf, block_size, myrow, mycol, nprow, npcol, a, local_m, local_n, n, myid, comm)
subroutine smumps_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)