15 & TOT_CONT_TO_RECV, root,
16 & BUFR, LBUFR, LBUFR_BYTES, PROCNODE_STEPS, POSFAC,
17 & IWPOS, IWPOSCB, IPTRLU,
18 & LRLU, LRLUS, N, IW, LIW, A, LA, PTRIST,
20 & PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP,
21 & IFLAG, IERROR, COMM, COMM_LOAD,
23 & NBFIN, MYID, SLAVEF,
25 & OPASSW, OPELIW, ITLOC, RHS_MUMPS,
27 & LPTRAR, NELT, FRTPTR, FRTELT,
29 & INTARR, DBLARR, ICNTL, KEEP, KEEP8, DKEEP, ND)
35 TYPE (DMUMPS_ROOT_STRUC) :: root
36 INTEGER KEEP(500), ICNTL(60)
38 DOUBLE PRECISION DKEEP(230)
39 INTEGER TOT_ROOT_SIZE, TOT_CONT_TO_RECV
40 INTEGER LBUFR, LBUFR_BYTES
42 INTEGER(8) :: IPTRLU, LRLU, LRLUS, LA, POSFAC
43 INTEGER(8) :: PTRFAC(KEEP(28)), PTRAST(KEEP(28))
44 INTEGER(8) :: PAMASTER(KEEP(28))
45 INTEGER IWPOS, IWPOSCB
48 DOUBLE PRECISION A( LA )
49 INTEGER PTRIST(KEEP(28)), PTLUST(KEEP(28))
50 INTEGER STEP(N), PIMASTER(KEEP(28))
52 INTEGER NSTK_S( KEEP(28) ), PROCNODE_STEPS( KEEP(28) )
53 INTEGER ND( KEEP(28) )
54 INTEGER IFLAG, IERROR, COMM, COMM_LOAD
56 INTEGER IPOOL( LPOOL )
57 INTEGER MYID, SLAVEF, NBFIN
58 DOUBLE PRECISION OPASSW, OPELIW
59 INTEGER ITLOC(N+KEEP(253)), FILS(N), DAD(KEEP(28))
61 INTEGER FRTPTR( N+1 ), FRTELT( NELT )
62 INTEGER(8),
INTENT(IN) :: PTRARW(LPTRAR), (LPTRAR)
63 DOUBLE PRECISION :: RHS_MUMPS(KEEP(255))
64 INTEGER INTARR(KEEP8(27))
65 DOUBLE PRECISION DBLARR(KEEP8(26))
67 DOUBLE PRECISION,
DIMENSION(:,:),
POINTER :: TMP
68 INTEGER NEW_LOCAL_M, NEW_LOCAL_N
69 INTEGER OLD_LOCAL_M, OLD_LOCAL_N
73 INTEGER POSHEAD, IPOS_SON,IERR
74 LOGICAL MASTER_OF_ROOT, NO_OLD_ROOT
76 parameter( zero = 0.0d0 )
77 include
'mumps_headers.h'
78 INTEGER numroc, MUMPS_PROCNODE
79 EXTERNAL numroc, mumps_procnode
81 root%TOT_ROOT_SIZE = tot_root_size
82 master_of_root = ( myid .EQ.
83 & mumps_procnode( procnode_steps(step(iroot)),
85 new_local_m = numroc( tot_root_size, root%MBLOCK,
86 & root%MYROW, 0, root%NPROW )
87 new_local_m =
max( 1, new_local_m )
88 new_local_n = numroc( tot_root_size, root%NBLOCK,
89 & root%MYCOL, 0, root%NPCOL )
90 IF ( ptrist(step( iroot )).GT.0)
THEN
91 old_local_n = -iw( ptrist(step( iroot )) + keep(ixsz) )
92 old_local_m = iw( ptrist(step( iroot )) + 1 + keep(ixsz))
95 old_local_m = new_local_m
97 IF (ptrist(step(iroot)) .EQ.0)
THEN
102 IF (keep(60) .NE. 0)
THEN
103 IF ( master_of_root )
THEN
104 lreqi=6+2*tot_root_size+keep(ixsz)
106 IF ( iwpos + lreqi - 1. gt. iwposcb )
THEN
109 & iwpos, iwposcb, ptrist, ptrast,
110 & step, pimaster, pamaster, lrlus,
111 & keep(ixsz),comp,dkeep(97),
112 & myid, slavef, procnode_steps, dad )
113 IF ( lrlu .NE. lrlus )
THEN
114 WRITE(*,*)
'PB1 compress root2slave:LRLU,LRLUS=',
121 IF ( iwpos + lreqi - 1. gt. iwposcb )
THEN
123 ierror = iwpos + lreqi - 1 - iwposcb
126 ptlust(step(iroot))= iwpos
127 iwpos = iwpos + lreqi
128 poshead = ptlust( step(iroot))
129 iw( poshead + xxi )=lreqi
132 iw( poshead + xxs )=-9999
133 iw(poshead+xxs+1:poshead+keep(ixsz)-1)=-99999
134 iw( poshead +keep(ixsz)) = 0
135 iw( poshead + 1 +keep(ixsz)) = -1
136 iw( poshead + 2 +keep(ixsz)) = -1
137 iw( poshead + 4 +keep(ixsz)) = step(iroot)
138 iw( poshead + 5 +keep(ixsz)) = 0
139 iw( poshead + 3 +keep(ixsz)) = tot_root_size
141 ptlust(step(iroot)) = -4444
143 ptrist(step(iroot)) = 0
144 ptrfac(step(iroot)) = -4445_8
145 IF (root%yes .and. no_old_root)
THEN
146 IF (new_local_n .GT. 0)
THEN
148 & root%SCHUR_LLD, root%SCHUR_MLOC, root%SCHUR_NLOC,
150 IF (keep(55).EQ.0)
THEN
152 & root%SCHUR_POINTER(1), root%SCHUR_LLD, root%SCHUR_MLOC,
153 & root%SCHUR_NLOC, fils, ptraiw, ptrarw, intarr, dblarr,
154 & keep8(27), keep8(26), myid )
157 & root%SCHUR_POINTER(1), root%SCHUR_LLD, root%SCHUR_MLOC,
158 & root%SCHUR_NLOC, lptrar, nelt, frtptr, frtelt,
159 & ptraiw, ptrarw, intarr, dblarr,
160 & keep8(27), keep8(26), keep, keep8, myid )
165 IF ( master_of_root )
THEN
166 lreqi = 6 + 2 * tot_root_size+keep(ixsz)
170 lreqa = int(new_local_m, 8) * int(new_local_n, 8)
172 & lreqi , lreqa, .false.,
176 & iwpos, iwposcb, ptrist, ptrast,
177 & step, pimaster, pamaster, lrlus,
178 & keep(ixsz), comp, dkeep(97),
179 & myid, slavef, procnode_steps, dad,
181 IF (iflag.LT.0)
GOTO 700
182 ptlust(step( iroot )) = iwpos
183 iwpos = iwpos + lreqi
184 IF (lreqa.EQ.0_8)
THEN
185 ptrast(step(iroot)) = posfac
186 ptrfac(step(iroot)) = posfac
188 ptrast(step(iroot)) = posfac
189 ptrfac(step(iroot)) = posfac
191 posfac = posfac + lreqa
193 lrlus = lrlus - lreqa
194 keep8(67) =
min(keep8(67), lrlus)
195 keep8(69) = keep8(69) + lreqa
196 keep8(68) =
max(keep8(69), keep8(68))
198 & la-lrlus,0_8,lreqa,keep,keep8,lrlus)
199 poshead = ptlust( step(iroot))
200 iw( poshead + xxi ) = lreqi
203 iw( poshead + xxs ) = s_notfree
204 iw(poshead+xxs+1:poshead+keep(ixsz
206 iw( poshead + 1 + keep(ixsz) ) = new_local_n
207 iw( poshead + 2 + keep(ixsz) ) = new_local_m
208 iw( poshead + 4 + keep(ixsz) ) = step(iroot)
209 iw( poshead + 5 + keep(ixsz) ) = 0
210 IF ( master_of_root )
THEN
211 iw( poshead + 3 + keep(ixsz) ) = tot_root_size
213 iw( poshead + 3 + keep(ixsz) ) = 0
215 IF ( ptrist(step(iroot)) .EQ. 0)
THEN
217 & new_local_m, new_local_m, new_local_n, keep)
218 IF (keep(55) .EQ.0 )
THEN
220 & a(ptrast(step(iroot))),
221 & new_local_m, new_local_m, new_local_n,
222 & fils, ptraiw, ptrarw, intarr, dblarr,
223 & keep8(27), keep8(26), myid )
226 & a(ptrast(step(iroot))),
227 & new_local_m, new_local_m, new_local_n,
228 & lptrar, nelt, frtptr, frtelt,
229 & ptraiw, ptrarw, intarr, dblarr,
230 & keep8(27), keep8(26), keep, keep8, myid )
232 pamaster(step(iroot)) = 0_8
233 ELSE IF ( ptrist(step(iroot)) .LT. 0 )
THEN
235 & new_local_m, new_local_m, new_local_n, keep)
237 old_local_n = -iw( ptrist(step( iroot )) + keep(ixsz) )
238 old_local_m = iw( ptrist(step( iroot )) + 1 + keep(ixsz))
239 IF ( tot_root_size .eq. root%ROOT_SIZE )
THEN
240 IF ( lreqa .NE. int(old_local_m,8) * int(old_local_n,8) )
242 write(*,*)
'error 1 in PROCESS_ROOT2SLAVE',
243 & old_local_m, old_local_n
247 & a( pamaster(step(iroot)) ),
248 & a( ptrast(step(iroot)) ) )
252 & new_local_n, a( pamaster( step(iroot)) ), old_local_m,
255 IF ( ptrist( step( iroot ) ) .GT. 0 )
THEN
256 ipos_son= ptrist( step(iroot))
259 & iw, liw, lrlu, lrlus, iptrlu,
260 & iwposcb, la, keep,keep8, .false.
264 ptrist(step( iroot )) = 0
265 pamaster(step( iroot )) = 0_8
267 IF ( no_old_root )
THEN
268 IF (keep(253) .GT.0)
THEN
269 root%RHS_NLOC = numroc( keep(253), root%NBLOCK,
270 & root%MYCOL, 0, root%NPCOL )
271 root%RHS_NLOC =
max( root%RHS_NLOC, 1 )
275 IF (
associated(root%RHS_ROOT))
DEALLOCATE(root%RHS_ROOT)
276 ALLOCATE(root%RHS_ROOT(new_local_m, root%RHS_NLOC),
278 IF ( allocok.GT.0 )
THEN
280 ierror = new_local_n * root%RHS_NLOC
283 IF (keep(253) .NE. 0)
THEN
288 ELSE IF (new_local_m.GT.old_local_m .AND. keep(253) .GT.0)
THEN
290 NULLIFY(root%RHS_ROOT)
291 ALLOCATE (root%RHS_ROOT(new_local_m, root%RHS_NLOC),
293 IF ( allocok.GT.0)
THEN
295 ierror = new_local_m*root%RHS_NLOC
298 DO j = 1, root%RHS_NLOC
299 DO i = 1, old_local_m
300 root%RHS_ROOT(i,j)=tmp(i,j)
302 DO i = old_local_m+1, new_local_m
309 keep(121) = keep(121) + tot_cont_to_recv
310 IF ( keep(121) .eq. 0 )
THEN
311 IF (keep(201).EQ.1)
THEN
313 ELSE IF (keep(201).EQ.2)
THEN
317 & slavef, keep(199), keep(28), keep(76), keep(80), keep(47),
319 IF (keep(47) .GE. 3)
THEN
322 & procnode_steps, keep,keep8, slavef, comm_load,
323 & myid, step, n, nd, fils )
subroutine dmumps_process_root2slave(tot_root_size, tot_cont_to_recv, root, bufr, lbufr, lbufr_bytes, procnode_steps, posfac, iwpos, iwposcb, iptrlu, lrlu, lrlus, n, iw, liw, a, la, ptrist, ptlust, ptrfac, ptrast, step, pimaster, pamaster, nstk_s, comp, iflag, ierror, comm, comm_load, ipool, lpool, leaf, nbfin, myid, slavef opassw, opeliw, itloc, rhs_mumps, fils, dad, lptrar, nelt, frtptr, frtelt, ptrarw, ptraiw, intarr, dblarr, icntl, keep, keep8, dkeep, nd)