15 & COMM_LOAD, ASS_IRECV,
17 & LBUFR_BYTES, PROCNODE_STEPS, MSGSOU,
18 & SLAVEF, IWPOS, IWPOSCB, IPTRLU, LRLU, LRLUS, N, IW, LIW,
19 & A, LA, PTRIST, PTRAST, NSTK_S, PERM,
20 & COMP, STEP, PIMASTER, PAMASTER, POSFAC,
21 & MYID, COMM, IFLAG, IERROR, NBFIN,
23 & PTLUST_S, PTRFAC, root, OPASSW, OPELIW,
24 & ITLOC, RHS_MUMPS, FILS, DAD,
25 & PTRARW, PTRAIW, INTARR, DBLARR,
26 & ICNTL,KEEP,KEEP8,DKEEP,IPOOL, LPOOL, LEAF, ND, FRERE_STEPS,
27 & LPTRAR, NELT, FRTPTR, FRTELT,
28 & ISTEP_TO_INIV2, TAB_POS_IN_PERE
44 TYPE (dmumps_root_struc) :: root
45 INTEGER icntl( 60 ), keep( 500 )
47 DOUBLE PRECISION dkeep(230)
48 INTEGER lbufr, lbufr_bytes
49 INTEGER comm_load, ass_irecv
51 INTEGER n, slavef, iwpos, iwposcb, liw
52 INTEGER(8) :: posfac, iptrlu, lrlu, lrlus, la
53 INTEGER(8) :: ptrast(keep(28))
54 INTEGER(8) :: pamaster(keep(28))
55 INTEGER(8) :: ptrfac(keep(28))
57 INTEGER iflag, ierror, nbfin, msgsou
58 INTEGER procnode_steps(keep(28)), ptrist(keep(28)),
60 INTEGER perm(n), step(n), pimaster(keep(28))
62 DOUBLE PRECISION a( la )
63 INTEGER,
intent(in) :: lrgroups(n)
65 INTEGER frtptr( n + 1 ), frtelt( )
66 INTEGER(8),
INTENT(IN) :: ptraiw( lptrar ), ptrarw( lptrar )
67 INTEGER istep_to_iniv2(keep(71)),
68 & tab_pos_in_pere(slavef+2,
max(1,keep(56)))
70 INTEGER ptlust_s(keep(28))
71 INTEGER itloc( n + keep(253)), fils( n ), dad( keep(28) )
72 DOUBLE PRECISION :: rhs_mumps(keep(255))
73 INTEGER nd( keep(28) ), frere_steps( keep(28) )
74 DOUBLE PRECISION opassw, opeliw
75 DOUBLE PRECISION flop1
76 DOUBLE PRECISION dblarr( keep8(26) )
77 INTEGER intarr( keep8(27) )
79 INTEGER ipool( lpool )
80 include
'mumps_headers.h'
82 include
'mumps_tags.h'
83 INTEGER :: status(mpi_status_size)
86 INTEGER inode, iposk, jposk, ncolu, npiv, position, ierr
87 INTEGER(8) poselt, posblocfacto
90 DOUBLE PRECISION,
DIMENSION(:),
POINTER :: a_ptr
91 INTEGER ioldps, lcont1, nrow1, ncol1, npiv1
92 INTEGER nslaves_tot, hs, dest, nslaves_follow
96 LOGICAL blocking, set_irecv, message_received
98 INTEGER lr_activated_int
99 LOGICAL lr_activated, compress_cb
100 INTEGER nb_blr_u, current_blr_u
101 TYPE (
lrb_type),
DIMENSION(:),
ALLOCATABLE :: blr_u
102 INTEGER,
POINTER,
DIMENSION(:) :: begs_blr_u
103 TYPE (
lrb_type),
DIMENSION(:),
POINTER :: blr_ls
104 TYPE (
lrb_type),
POINTER,
DIMENSION(:,:) :: cb_lrb
105 INTEGER,
POINTER,
DIMENSION(:) :: begs_blr_ls, begs_blr_col
106 INTEGER :: nb_blr_ls, ipanel,
107 & maxi_cluster_ls, maxi_cluster,
108 & nb_blr_col, maxi_cluster_col, npartsass_master
109 DOUBLE PRECISION,
ALLOCATABLE,
DIMENSION(:) :: work, tau
110 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: jpvt
111 DOUBLE PRECISION,
ALLOCATABLE,
DIMENSION(:,:) :: blocklr
112 DOUBLE PRECISION,
ALLOCATABLE,
DIMENSION(:) :: rwork
113 INTEGER :: omp_num, lwork
115 INTEGER :: nfs4father, nass1, nelim, info_tmp(2)
116 INTEGER :: nvschur_k253, nslaves_l, irow_l
118 DOUBLE PRECISION,
ALLOCATABLE,
DIMENSION(:) :: m_array
119 DOUBLE PRECISION,
ALLOCATABLE,
DIMENSION(:) :: udynamic
120 DOUBLE PRECISION one,
alpha
121 PARAMETER (one = 1.0d0,
alpha=-1.0d0)
122 dynamic_alloc = .false.
124 CALL mpi_unpack( bufr, lbufr_bytes, position, inode, 1,
126 CALL mpi_unpack( bufr, lbufr_bytes, position, iposk, 1,
127 & mpi_integer, comm, ierr )
128 CALL mpi_unpack( bufr, lbufr_bytes, position, jposk, 1,
129 & mpi_integer, comm, ierr )
130 CALL mpi_unpack( bufr, lbufr_bytes, position, npiv, 1,
131 & mpi_integer, comm, ierr )
132 IF ( npiv .LE. 0 )
THEN
134 WRITE(*,*)
myid,
':error, received negative NPIV in BLFAC'
137 CALL mpi_unpack( bufr, lbufr_bytes, position, fpere, 1,
138 & mpi_integer, comm, ierr )
139 CALL mpi_unpack( bufr, lbufr_bytes, position, ncolu, 1,
140 & mpi_integer, comm, ierr )
142 & lr_activated_int, 1,
143 & mpi_integer, comm, ierr )
144 lr_activated = (lr_activated_int.EQ.1)
147 & mpi_integer, comm, ierr )
148 IF (lr_activated)
THEN
150 & nb_blr_u, 1, mpi_integer,
153 ALLOCATE(blr_u(
max(nb_blr_u,1)),
154 & begs_blr_u(nb_blr_u+2), stat=allocok)
155 if (allocok .GT. 0)
THEN
157 ierror =
max(nb_blr_u,1) + nb_blr_u+2
161 & position, jposk-1, 0,
'V',
164 & keep8, comm, ierr, iflag, ierror)
165 IF (iflag.LT.0)
GOTO 700
167 laell = int(npiv,8) * int(ncolu,8)
173 & iwpos, iwposcb, ptrist, ptrast,
174 & step, pimaster, pamaster, lrlus,
176 & procnode_steps, dad,
178 IF (iflag.LT.0)
GOTO 700
180 lrlus = lrlus - laell
181 keep8(67) =
min(lrlus, keep8(67))
182 keep8(69) = keep8(69) + laell
183 keep8(68) =
max(keep8(69), keep8(68))
184 posblocfacto = posfac
185 posfac = posfac + laell
187 & la-lrlus,0_8, laell,keep,keep8,lrlus)
189 & a(posblocfacto), npiv*ncolu,
190 & mpi_double_precision,
193 IF (ptrist(step( inode )) .EQ. 0) dynamic_alloc = .true.
194 IF ( (ptrist(step( inode )).NE.0) .AND.
195 & (iposk + npiv -1 .GT.
196 & iw(ptrist(step(inode))+3+keep(ixsz))) )
THEN
197 dynamic_alloc = .true.
199 IF (lr_activated)
THEN
200 dynamic_alloc = .false.
202 IF (dynamic_alloc)
THEN
203 ALLOCATE(udynamic(laell), stat=allocok)
204 if (allocok .GT. 0)
THEN
209 udynamic(1_8:laell) = a(posblocfacto:posblocfacto+laell-1_8)
211 lrlus = lrlus + laell
212 keep8(69) = keep8(69) - laell
213 posfac = posfac - laell
215 & la-lrlus,0_8,-laell,keep,keep8,lrlus)
217 IF (ptrist(step( inode )) .EQ. 0)
THEN
219 & bufr, lbufr, lbufr_bytes, procnode_steps, posfac,
220 & iwpos, iwposcb, iptrlu,
221 & lrlu, lrlus, n, iw, liw, a, la, ptrist,
223 & ptrast, step, pimaster, pamaster, nstk_s,
comp,
224 & iflag, ierror, comm,
225 & perm, ipool, lpool, leaf, nbfin,
myid, slavef,
227 & root, opassw, opeliw, itloc, rhs_mumps,
228 & fils, dad, ptrarw, ptraiw,
229 & intarr, dblarr, icntl,keep,keep8,dkeep,nd, frere_steps,
230 & lptrar, nelt, frtptr, frtelt,
231 & istep_to_iniv2, tab_pos_in_pere, .true.
234 IF ( iflag .LT. 0 )
GOTO 600
236 DO WHILE ( iposk + npiv -1 .GT.
237 & iw( ptrist(step( inode )) + 3 +keep(ixsz)) )
242 message_received = .false.
244 & ass_irecv, blocking, set_irecv, message_received,
245 & msgsou, bloc_facto_sym, status,
246 & bufr, lbufr, lbufr_bytes, procnode_steps, posfac,
247 & iwpos, iwposcb, iptrlu,
248 & lrlu, lrlus, n, iw, liw, a, la, ptrist,
250 & ptrast, step, pimaster, pamaster, nstk_s,
comp,
251 & iflag, ierror, comm,
252 & perm, ipool, lpool, leaf, nbfin,
myid, slavef,
254 & root, opassw, opeliw, itloc, rhs_mumps,
255 & fils, dad, ptrarw, ptraiw,
256 & intarr, dblarr, icntl, keep,keep8,dkeep, nd, frere_steps,
257 & lptrar, nelt, frtptr, frtelt,
258 & istep_to_iniv2, tab_pos_in_pere, .true.
261 IF ( iflag .LT. 0 )
GOTO 600
265 message_received = .true.
267 & ass_irecv, blocking, set_irecv, message_received,
268 & mpi_any_source, mpi_any_tag,
270 & bufr, lbufr, lbufr_bytes, procnode_steps, posfac,
271 & iwpos, iwposcb, iptrlu,
272 & lrlu, lrlus, n, iw, liw, a, la, ptrist,
274 & ptrast, step, pimaster, pamaster, nstk_s,
comp,
275 & iflag, ierror, comm,
276 & perm, ipool, lpool, leaf, nbfin,
myid, slavef,
278 & root, opassw, opeliw, itloc, rhs_mumps,
279 & fils, dad, ptrarw, ptraiw,
280 & intarr, dblarr, icntl, keep,keep8,dkeep, nd, frere_steps,
281 & lptrar, nelt, frtptr, frtelt,
282 & istep_to_iniv2, tab_pos_in_pere, .true.
285 ioldps = ptrist(step( inode ))
287 & ptrast(step(inode)), iw(ioldps+xxd), iw(ioldps+xxr),
288 & a_ptr, poselt, la_ptr )
289 lcont1 = iw( ioldps + keep(ixsz) )
290 nrow1 = iw( ioldps + 2 + keep(ixsz))
291 npiv1 = iw( ioldps + 3 + keep(ixsz))
292 nslaves_tot = iw( ioldps + 5 + keep(ixsz))
293 hs = 6 + nslaves_tot + keep(ixsz)
294 ncol1 = lcont1 + npiv1
295 IF (lr_activated)
THEN
297 & begs_blr_ls, blr_ls)
298 nb_blr_ls =
size(begs_blr_ls)-2
303 & a_ptr(poselt), la_ptr, 1_8,
304 & iflag, ierror, ncol1,
305 & begs_blr_ls(1),
size(begs_blr_ls),
306 & begs_blr_u(1),
size(begs_blr_u),
308 & blr_ls(1), nb_blr_ls+1,
309 & blr_u(1), nb_blr_u+1,
315 & keep(481), dkeep(11), keep(466), keep(477)
321 IF (
allocated(blr_u))
DEALLOCATE(blr_u)
322 IF (
associated(begs_blr_u))
DEALLOCATE(begs_blr_u)
323 IF (iflag.LT.0)
GOTO 700
324 IF (keep(486).EQ.3)
THEN
329 cpos = poselt + int(jposk - 1,8)
330 lpos = poselt + int(iposk - 1,8)
331 IF ( npiv .GT. 0 )
THEN
332 IF (dynamic_alloc)
THEN
333 CALL dgemm(
'T',
'N', ncolu, nrow1, npiv,
alpha,
335 & a_ptr( lpos ), ncol1, one,
336 & a_ptr( cpos ), ncol1 )
338 CALL dgemm(
'T',
'N', ncolu, nrow1, npiv,
alpha,
339 & a( posblocfacto ), npiv,
340 & a_ptr( lpos ), ncol1, one,
341 & a_ptr( cpos ), ncol1 )
345 IF (npiv .GT. 0)
THEN
346 flop1 = dble(ncolu*npiv)*dble(2*nrow1)
350 IF ( iw(ioldps+6+keep(ixsz)).EQ.
351 & huge(iw(ioldps+6+keep(ixsz))) )
THEN
352 iw(ioldps+6+keep(ixsz)) = 1
354 iw(ioldps+6+keep(ixsz)) =
355 & iw(ioldps+6+keep(ixsz)) + 1
356 IF (.NOT.lr_activated)
THEN
357 IF (dynamic_alloc)
THEN
361 lrlus = lrlus + laell
362 keep8(69) = keep8(69) - laell
363 posfac = posfac - laell
365 & la-lrlus,0_8,-laell,keep,keep8,lrlus)
368 nslaves_follow = iw( ioldps + 5 +keep(ixsz) ) - xtra_slaves_sym
369 IF ( iw( ioldps + 6 +keep(ixsz)) .eq. 0 .and.
370 & keep(50) .ne. 0 .and. nslaves_follow .eq. 0 )
375 IF ( ierr .LT. 0 )
THEN
376 write(*,*)
' Internal error in PROCESS_BLFAC_SLAVE.'
381 IF (iw(ptrist(step(inode)) + 6+keep(ixsz) ) .eq. 0)
THEN
382 npiv1 = iw( ioldps + 3 + keep(ixsz))
383 nass1 = iw( ioldps + 4 + keep(ixsz))
384 nelim = nass1 - npiv1
386 IF (lr_activated)
THEN
387 compress_cb = ((iw(ptrist(step(inode))+xxlr).EQ.1).OR.
388 & (iw(ptrist(step(inode))+xxlr).EQ.3))
389 IF (compress_cb.AND.npiv.EQ.0)
THEN
390 compress_cb = .false.
391 iw(ioldps+xxlr) = iw(ioldps+xxlr) -1
393 IF (compress_cb)
THEN
395 & begs_blr_col, npartsass_master)
396 nb_blr_col =
size(begs_blr_col) - 1
397 allocate(cb_lrb(nb_blr_ls,nb_blr_col-npartsass_master),
399 IF (allocok > 0)
THEN
401 ierror = nb_blr_ls*(nb_blr_col-npartsass_master)
405 DO jj=1,nb_blr_col-npartsass_master
408 NULLIFY(cb_lrb(ii,jj)%Q)
409 NULLIFY(cb_lrb(ii,jj)%R)
410 cb_lrb(ii,jj)%ISLR = .false.
414 call max_cluster(begs_blr_ls,nb_blr_ls+1,maxi_cluster_ls)
415 CALL max_cluster(begs_blr_col,nb_blr_col,maxi_cluster_col)
416 maxi_cluster =
max(maxi_cluster_ls,
417 & maxi_cluster_col+nelim,npiv)
418 lwork = maxi_cluster*maxi_cluster
423 ALLOCATE(blocklr(maxi_cluster, omp_num*maxi_cluster),
424 & rwork(2*maxi_cluster*omp_num),
425 & tau(maxi_cluster*omp_num),
426 & jpvt(maxi_cluster*omp_num),
427 & work(lwork*omp_num),
429 IF (allocok > 0 )
THEN
431 ierror = omp_num*(lwork + maxi_cluster*(maxi_cluster+4))
435 IF ( (keep(219).NE.0).AND.(keep(50).EQ.2) )
THEN
438 nfs4father =
max(nfs4father,0) + nelim
440 ALLOCATE(m_array(
max(nfs4father,1)), stat=allocok)
441 IF (allocok.gt.0)
THEN
443 ierror =
max(nfs4father,1)
446 begs_blr_col(1+npartsass_master) =
447 & begs_blr_col(1+npartsass_master) -
449 IF ( (keep(219).NE.0).AND.(keep(50).EQ.2).AND.
450 & nfs4father.GT.0 )
THEN
452 & n, inode, fpere, keep,
455 & nrow1, ncol1, npiv1,
460 IF ((keep(114).EQ.1) .AND. (keep(116).GT.0)
461 & .AND. (keep(50).EQ.2)
463 nslaves_l = iw(ptrist(step(inode)) + 5 + keep(ixsz))
464 irow_l = ptrist(step(inode)) + 6 + nslaves_l +
471 & perm, nvschur_k253 )
479 & a_ptr(poselt), la_ptr, 1_8, ncol1,
480 & begs_blr_ls(1),
size(begs_blr_ls),
481 & begs_blr_col(1),
size(begs_blr_col),
482 & nb_blr_ls, nb_blr_col-npartsass_master,
484 & nrow1, ncol1-npiv1, inode,
485 & iw(ioldps+xxf), 1, 2, iflag, ierror,
486 & dkeep(12), keep(466), keep(484), keep(489),
488 & work, tau, jpvt, lwork, rwork, blocklr,
489 & maxi_cluster, keep8, omp_num,
490 & nfs4father, npiv1, nvschur_k253, keep(1),
496 IF (iflag.LT.0)
GOTO 650
497 IF ( (keep(219).NE.0).AND.(keep(50).EQ.2).AND.
498 & nfs4father.GT.0 )
THEN
507 IF (
allocated(m_array))
DEALLOCATE(m_array)
508 IF (
allocated(blocklr))
DEALLOCATE(blocklr)
509 IF (
allocated(rwork))
DEALLOCATE(rwork)
510 IF (
allocated(tau))
DEALLOCATE(tau)
511 IF (
allocated(jpvt))
DEALLOCATE(jpvt)
512 IF (
allocated(work))
DEALLOCATE(work)
513 IF (iflag.LT.0)
GOTO 700
521 & bufr, lbufr, lbufr_bytes, procnode_steps, posfac,
522 & iwpos, iwposcb, iptrlu, lrlu, lrlus, iw, liw, a, la,
523 & ptrist, ptlust_s, ptrfac,
524 & ptrast, step, pimaster, pamaster,
525 & nstk_s,
comp, iflag, ierror, perm,
526 & ipool, lpool, leaf, nbfin, slavef,
527 & opassw, opeliw, itloc, rhs_mumps, fils, dad, ptrarw, ptraiw,
528 & intarr,dblarr,icntl,keep,keep8,dkeep,nd,frere_steps,
529 & lptrar, nelt, frtptr, frtelt,
530 & istep_to_iniv2, tab_pos_in_pere
538 IF (
allocated(blr_u))
DEALLOCATE(blr_u)
539 IF (compress_cb)
THEN
540 IF (
allocated(blocklr))
DEALLOCATE(blocklr)
541 IF (
allocated(rwork))
DEALLOCATE(rwork)
542 IF (
allocated(tau))
DEALLOCATE(tau)
543 IF (
allocated(jpvt))
DEALLOCATE(jpvt)
544 IF (
allocated(work))
DEALLOCATE(work)
546 IF (
allocated(m_array))
DEALLOCATE(m_array)
547 IF (dynamic_alloc)
THEN
548 IF (
allocated(udynamic))
DEALLOCATE(udynamic)