43
44 IMPLICIT NONE
45 include 'mumps_headers.h'
46 TYPE (ZMUMPS_ROOT_STRUC) :: root
47 INTEGER ICNTL( 60 ), KEEP( 500 )
48 INTEGER(8) KEEP8(150)
49 DOUBLE PRECISION DKEEP(230)
50 INTEGER LBUFR, LBUFR_BYTES
51 INTEGER COMM_LOAD, ASS_IRECV
52 INTEGER ( LBUFR )
53 INTEGER N, SLAVEF, IWPOS, IWPOSCB, LIW
54 INTEGER(8) :: IPTRLU, LRLU, LRLUS, LA
55 INTEGER(8) :: POSFAC
56 INTEGER COMP
57 INTEGER , IERROR, NBFIN, MSGSOU
58 INTEGER PROCNODE_STEPS(KEEP(28)), PTRIST(KEEP(28)),
59 & NSTK_S(KEEP(28))
60 INTEGER(8) :: PAMASTER(KEEP(28))
61 INTEGER(8) :: PTRAST(KEEP(28))
62 INTEGER(8) :: PTRFAC(KEEP(28))
63 INTEGER PERM(N), STEP(N),
64 & PIMASTER(KEEP(28))
65 INTEGER IW( LIW )
66 COMPLEX(kind=8) A( LA )
67 INTEGER, intent(in) :: LRGROUPS(N)
68 INTEGER COMM, MYID
69 INTEGER NELT, LPTRAR
70 INTEGER FRTPTR( N+1 ), FRTELT( NELT )
71 INTEGER PTLUST_S(KEEP(28)),
72 & ITLOC(N+KEEP(253)), FILS(N), DAD(KEEP(28)), ND(KEEP(28))
73 COMPLEX(kind=8) :: RHS_MUMPS(KEEP(255))
74 INTEGER(8), INTENT(IN) :: PTRAIW( LPTRAR ), PTRARW( LPTRAR )
75 INTEGER FRERE_STEPS(KEEP(28))
76 DOUBLE PRECISION OPASSW, OPELIW
77 DOUBLE PRECISION FLOP1
78 INTEGER INTARR( KEEP8(27) )
79 COMPLEX(kind=8) DBLARR( KEEP8(26) )
80 INTEGER LEAF, LPOOL
81 INTEGER IPOOL( LPOOL )
82 INTEGER ISTEP_TO_INIV2(KEEP(71)),
83 & TAB_POS_IN_PERE(SLAVEF+2,max(1,KEEP(56)))
84 include 'mpif.h'
85 include 'mumps_tags.h'
86 INTEGER :: (MPI_STATUS_SIZE)
87 LOGICAL :: I_HAVE_SET_K117
88 INTEGER INODE, POSITION, NPIV, IERR, LP
89 INTEGER NCOL
90 INTEGER(8) :: POSBLOCFACTO
91 INTEGER :: LD_BLOCFACTO
92 INTEGER(8) :: LA_BLOCFACTO
93 INTEGER(8) :: LA_PTR
94 INTEGER(8) :: POSELT
95 COMPLEX(kind=8), DIMENSION(:), POINTER :: A_PTR
96 INTEGER IOLDPS, LCONT1, NASS1, NROW1, NCOL1, NPIV1
97 INTEGER NSLAV1, HS, ISW
98 INTEGER (8) :: LPOS, UPOS, LPOS2, IPOS, KPOS
99 INTEGER ICT11
100 INTEGER I, IPIV, FPERE
101 LOGICAL LASTBL, KEEP_BEGS_BLR_L
102 LOGICAL BLOCKING, SET_IRECV, MESSAGE_RECEIVED
103 COMPLEX(kind=8) ONE,ALPHA
104 parameter(one=(1.0d0,0.0d0),
alpha=(-1.0d0,0.0d0))
105 INTEGER LIWFAC, STRAT, NextPivDummy
106 TYPE(IO_BLOCK) :: MonBloc
107 LOGICAL
108 INTEGER LRELAY_INFO
109 INTEGER :: INFO_TMP(2)
110 INTEGER :: IDUMMY(1)
111 INTEGER :: , NPARTSASS_MASTER, NPARTSASS_MASTER_AUX,
112 & IPANEL,
113 & CURRENT_BLR,
114 & NB_BLR_L, NB_BLR_U, NB_BLR_COL
115 TYPE (LRB_TYPE), POINTER, DIMENSION(:,:) :: CB_LRB
116 TYPE (LRB_TYPE), DIMENSION(:), POINTER :: BLR_U, BLR_L
117 LOGICAL :: LR_ACTIVATED, COMPRESS_CB, COMPRESS_PANEL
118 LOGICAL OOCWRITE_COMPATIBLE_WITH_BLR
119 INTEGER ::
120 INTEGER, POINTER, DIMENSION(:) :: BEGS_BLR_L, BEGS_BLR_U,
121 & BEGS_BLR_COL
122 COMPLEX(kind=8), ALLOCATABLE, DIMENSION(:) :: WORK, TAU
123 INTEGER, ALLOCATABLE, DIMENSION(:) :: JPVT
124 DOUBLE PRECISION,ALLOCATABLE,DIMENSION(:) :: RWORK
125 COMPLEX(kind=8), ALLOCATABLE, DIMENSION(:,:) :: BLOCK
126 INTEGER :: OMP_NUM
127 INTEGER NPARTSASS, NPARTSCB, MAXI_CLUSTER, LWORK,
128 & MAXI_CLUSTER_L, MAXI_CLUSTER_U,
129 INTEGER :: allocok
130 INTEGER MUMPS_PROCNODE
132 keep_begs_blr_l = .false.
133 nullify(begs_blr_l)
134 nb_blr_u = -7654321
135 NULLIFY(begs_blr_u)
136 i_have_set_k117 = .false.
137 fpere = -1
138 position = 0
139 CALL mpi_unpack( bufr, lbufr_bytes, position, inode, 1,
140 & mpi_integer, comm, ierr )
141 CALL mpi_unpack( bufr, lbufr_bytes, position, npiv, 1,
142 & mpi_integer, comm, ierr )
143 lastbl = (npiv.LE.0)
144 IF (lastbl) THEN
145 npiv = -npiv
146 CALL mpi_unpack( bufr, lbufr_bytes, position, fpere, 1,
147 & mpi_integer, comm
148 ENDIF
149 CALL mpi_unpack( bufr, lbufr_bytes, position, ncol, 1,
150 & mpi_integer, comm, ierr )
151 CALL mpi_unpack( bufr, lbufr_bytes, position, nelim, 1,
152 & mpi_integer, comm, ierr )
154 & npartsass_master , 1,
155 & mpi_integer, comm, ierr )
156 CALL mpi_unpack( bufr, lbufr_bytes, position, ipanel,
157 & 1, mpi_integer, comm, ierr )
158 CALL mpi_unpack( bufr, lbufr_bytes, position, lr_activated_int,
159 & 1, mpi_integer, comm, ierr )
160 lr_activated = (lr_activated_int.EQ.1)
161 IF ( lr_activated ) THEN
162 la_blocfacto = int(npiv,8) * int(npiv+nelim,8)
163 ELSE
164 la_blocfacto = int(npiv,8) * int(ncol,8)
165 ENDIF
167 & npiv, la_blocfacto, .false.,
168 & keep(1), keep8(1),
169 & n, iw, liw, a, la,
170 & lrlu, iptrlu,
171 & iwpos, iwposcb, ptrist, ptrast,
172 & step, pimaster, pamaster, lrlus,
173 & keep(ixsz),
comp,dkeep(97),
myid,slavef, procnode_steps,
174 & dad, iflag, ierror)
175 IF (iflag.LT.0) GOTO 700
176 lrlu = lrlu - la_blocfacto
177 lrlus = lrlus - la_blocfacto
178 keep8(67) =
min(lrlus, keep8(67))
179 keep8(69) = keep8(69) + la_blocfacto
180 keep8(68) =
max(keep8(69), keep8(68))
181 posblocfacto = posfac
182 posfac = posfac + la_blocfacto
184 & la-lrlus,0_8,la_blocfacto,keep,keep8,lrlus)
185 IF ((npiv .EQ. 0)
186 & ) THEN
187 ipiv=1
188 ELSE
189 ipiv = iwpos
190 iwpos = iwpos + npiv
191 IF (npiv .GT. 0) THEN
193 & iw( ipiv ), npiv,
194 & mpi_integer, comm, ierr )
195 ENDIF
196 IF ( lr_activated ) THEN
198 & a(posblocfacto), npiv*(npiv+nelim),
199 & mpi_double_complex,
200 & comm, ierr )
201 ld_blocfacto = npiv+nelim
203 & nb_blr_u, 1, mpi_integer,
204 & comm, ierr )
205 ALLOCATE(blr_u(
max(nb_blr_u,1)), stat=allocok)
206 IF (allocok > 0 ) THEN
207 iflag = -13
208 ierror =
max(nb_blr_u,1)
209 lp = icntl(1)
210 IF (icntl(4) .LE. 0) lp=-1
211 IF (lp > 0)
WRITE(lp,*)
myid,
212 & ': ERROR allocation during ZMUMPS_PROCESS_BLOCFACTO'
213 GOTO 700
214 ENDIF
215 ALLOCATE(begs_blr_u(nb_blr_u+2), stat=allocok)
216 IF (allocok > 0 ) THEN
217 iflag = -13
218 ierror = nb_blr_u+2
219 lp = icntl(1)
220 IF (icntl(4) .LE. 0) lp=-1
221 IF (lp > 0)
WRITE(lp,*)
myid,
222 & ': ERROR allocation during ZMUMPS_PROCESS_BLOCFACTO'
223 GOTO 700
224 ENDIF
226 & position, npiv, nelim, 'H',
227 & blr_u(1), nb_blr_u,
228 & begs_blr_u(1),
229 & keep8, comm, ierr, iflag, ierror)
230 IF (iflag.LT.0) GOTO 700
231 ELSE
233 & a(posblocfacto), npiv*ncol,
234 & mpi_double_complex,
235 & comm, ierr )
236 ld_blocfacto = ncol
237 ENDIF
238 ENDIF
240 & lrelay_info, 1,
241 & mpi_integer, comm, ierr )
242 IF (ptrist(step( inode )) .EQ. 0) THEN
244 & ass_irecv,
245 & bufr, lbufr, lbufr_bytes, procnode_steps, posfac,
246 & iwpos, iwposcb, iptrlu,
247 & lrlu, lrlus, n, iw, liw, a, la, ptrist,
248 & ptlust_s, ptrfac,
249 & ptrast, step, pimaster, pamaster, nstk_s,
comp,
250 & iflag, ierror, comm,
251 & perm, ipool, lpool, leaf, nbfin,
myid, slavef,
252 &
253 & root, opassw, opeliw, itloc, rhs_mumps,
254 & fils, dad, ptrarw, ptraiw,
255 & intarr, dblarr, icntl,keep,keep8,dkeep,nd, frere_steps,
256 & lptrar, nelt, frtptr, frtelt,
257 & istep_to_iniv2, tab_pos_in_pere, .true.
258 & , lrgroups
259 & )
260 IF ( iflag .LT. 0 ) GOTO 600
261 ENDIF
262 IF ( iw( ptrist(step(inode)) + 3 +keep(ixsz)) .EQ. 0 ) THEN
263 DO WHILE ( iw(ptrist(step(inode)) + xxnbpr) .NE. 0)
264 blocking = .true.
265 set_irecv = .false.
266 message_received = .false.
268 & ass_irecv, blocking, set_irecv, message_received,
269 & mpi_any_source, contrib_type2,
270 & status,
271 & bufr, lbufr, lbufr_bytes, procnode_steps, posfac,
272 & iwpos, iwposcb, iptrlu,
273 & lrlu, lrlus, n, iw, liw, a, la, ptrist,
274 & ptlust_s, ptrfac,
275 & ptrast, step, pimaster, pamaster, nstk_s,
comp,
276 & iflag, ierror, comm,
277 & perm, ipool, lpool, leaf, nbfin,
myid, slavef,
278 &
279 & root, opassw, opeliw, itloc, rhs_mumps,
280 & fils, dad, ptrarw, ptraiw,
281 & intarr, dblarr, icntl,keep,keep8,dkeep,nd, frere_steps,
282 & lptrar, nelt, frtptr, frtelt,
283 & istep_to_iniv2, tab_pos_in_pere, .true.
284 & , lrgroups
285 & )
286 IF ( iflag .LT. 0 ) GOTO 600
287 END DO
288 ENDIF
289 set_irecv = .true.
290 blocking = .false.
291 message_received = .true.
293 & blocking, set_irecv, message_received,
294 & mpi_any_source, mpi_any_tag,
295 & status,
296 & bufr, lbufr, lbufr_bytes, procnode_steps, posfac,
297 & iwpos, iwposcb, iptrlu,
298 & lrlu, lrlus, n, iw, liw, a, la, ptrist,
299 & ptlust_s, ptrfac,
300 & ptrast, step, pimaster, pamaster, nstk_s,
comp,
301 & iflag, ierror, comm,
302 & perm, ipool, lpool, leaf, nbfin,
myid, slavef,
303 &
304 & root, opassw, opeliw, itloc, rhs_mumps,
305 & fils, dad, ptrarw, ptraiw,
306 & intarr, dblarr,icntl,keep,keep8,dkeep,nd, frere_steps,
307 & lptrar, nelt, frtptr, frtelt,
308 & istep_to_iniv2, tab_pos_in_pere, .true.
309 & , lrgroups
310 & )
311 ioldps = ptrist(step(inode))
313 & ptrast(step(inode)), iw(ioldps+xxd), iw(ioldps+xxr),
314 & a_ptr, poselt, la_ptr )
315 lcont1 = iw( ioldps + keep(ixsz))
316 nass1 = iw( ioldps + 1 + keep(ixsz))
317 compress_panel = (iw(ioldps+xxlr).GE.2)
318 oocwrite_compatible_with_blr =
319 & ( .NOT.lr_activated.OR. (.NOT.compress_panel).OR.
320 & (keep(486).NE.2)
321 & )
322 IF ( nass1 < 0 ) THEN
323 nass1 = -nass1
324 iw( ioldps + 1 + keep(ixsz)) = nass1
325 IF (keep(55) .EQ. 0) THEN
327 & ioldps, a_ptr(poselt), la_ptr, 1_8, keep, keep8, itloc,
328 & fils, ptraiw,
329 & ptrarw, intarr, dblarr, keep8(27), keep8(26), rhs_mumps,
330 & lrgroups)
331 ELSE
333 & ioldps, a_ptr(poselt), la_ptr, 1_8, keep, keep8, itloc,
334 & fils, ptraiw,
335 & ptrarw, intarr, dblarr, keep8(27), keep8(26),
336 & frtptr, frtelt, rhs_mumps, lrgroups)
337 ENDIF
338 ENDIF
339 nrow1 = iw( ioldps + 2 +keep(ixsz))
340 npiv1 = iw( ioldps + 3 +keep(ixsz))
341 nslav1 = iw( ioldps + 5 + keep(ixsz))
342 hs = 6 + nslav1 + keep(ixsz)
343 ncol1 = lcont1 + npiv1
344 IF (npiv.GT.0) THEN
345 ict11 = ioldps+hs+nrow1+npiv1 - 1
346 DO i = 1, npiv
347 IF (iw(ipiv+i-1).EQ.i) cycle
348 isw = iw(ict11+i)
349 iw(ict11+i) = iw(ict11+iw(ipiv+i-1))
350 iw(ict11+iw(ipiv+i-1)) = isw
351 ipos = poselt + int(npiv1 + i - 1,8)
352 kpos = poselt + int(npiv1 + iw(ipiv+i-1) - 1,8)
353 CALL zswap(nrow1, a_ptr(ipos), ncol1, a_ptr(kpos), ncol1)
354 ENDDO
355 lpos2 = poselt + int(npiv1,8)
356 lpos = lpos2 + int(npiv,8)
357 IF ((.NOT. lr_activated).OR.keep(475).EQ.0) THEN
358 CALL ztrsm(
'L','l
','n
','n
', NPIV, NROW1, ONE,
359 & A(POSBLOCFACTO), LD_BLOCFACTO,
360 & A_PTR(LPOS2), NCOL1)
361 ENDIF
362 ENDIF
363 COMPRESS_CB = .FALSE.
364 IF ( LR_ACTIVATED) THEN
365.EQ..OR. COMPRESS_CB = ((IW(IOLDPS+XXLR)1)
366.EQ. & (IW(IOLDPS+XXLR)3))
367.AND..EQ. IF (COMPRESS_CBNPIV0) THEN
368 COMPRESS_CB = .FALSE.
369 IW(IOLDPS+XXLR) = IW(IOLDPS+XXLR) -1
370 ENDIF
371.NE. IF (NPIV0) THEN
372.EQ. IF ( (NPIV10)
373 & ) THEN
374 IOLDPS = PTRIST(STEP(INODE))
375 CALL GET_CUT(IW(IOLDPS+HS:IOLDPS+HS+NROW1-1), 0,
376 & NROW1, LRGROUPS, NPARTSCB,
377 & NPARTSASS, BEGS_BLR_L)
378 CALL REGROUPING2(BEGS_BLR_L, NPARTSASS, 0, NPARTSCB,
379 & NROW1-0, KEEP(488), .TRUE., KEEP(472))
380 NB_BLR_L = NPARTSCB
381.EQ. IF (IPANEL1) THEN
382 BEGS_BLR_COL=>BEGS_BLR_U
383 ELSE
384 ALLOCATE(BEGS_BLR_COL(size(BEGS_BLR_U)+IPANEL-1),
385 & stat=allocok)
386 IF (allocok > 0 ) THEN
387 IFLAG = -13
388 IERROR = size(BEGS_BLR_U)+IPANEL-1
389 LP = ICNTL(1)
390.LE. IF (ICNTL(4) 0) LP=-1
391 IF (LP > 0) WRITE(LP,*) MYID,
393 GOTO 700
394 ENDIF
395 BEGS_BLR_COL(1:IPANEL-1) = 1
396 DO I=1,size(BEGS_BLR_U)
397 BEGS_BLR_COL(IPANEL+I-1) = BEGS_BLR_U(I)
398 ENDDO
399 ENDIF
400 INFO_TMP(1) = IFLAG
401 INFO_TMP(2) = IERROR
402.LT. IF (IFLAG0) GOTO 700
403 CALL ZMUMPS_BLR_SAVE_INIT(IW(IOLDPS+XXF),
404 & .FALSE.,
405 & .TRUE.,
406 & .TRUE.,
407 & NPARTSASS_MASTER,
408 & BEGS_BLR_L,
409 & BEGS_BLR_COL,
410 & huge(NPARTSASS_MASTER),
411 & INFO_TMP)
412 IFLAG = INFO_TMP(1)
413 IERROR = INFO_TMP(2)
414.NE. IF (IPANEL1) THEN
415 DEALLOCATE(BEGS_BLR_COL)
416 ENDIF
417.LT. IF (IFLAG0) GOTO 700
418 ELSE
419 CALL ZMUMPS_BLR_RETRIEVE_BEGS_BLR_L (IW(IOLDPS+XXF),
420 & BEGS_BLR_L)
421 KEEP_BEGS_BLR_L = .TRUE.
422 NB_BLR_L = size(BEGS_BLR_L) - 2
423 NPARTSASS = 1
424 NPARTSCB = NB_BLR_L
425 ENDIF
426 ENDIF
427 ENDIF
428.GT. IF ( (NPIV 0)
429 & ) THEN
430 IF (LR_ACTIVATED) THEN
431 call MAX_CLUSTER(BEGS_BLR_L,NB_BLR_L+1,MAXI_CLUSTER_L)
432 call MAX_CLUSTER(BEGS_BLR_U,NB_BLR_U+1,MAXI_CLUSTER_U)
433.AND. IF (LASTBLCOMPRESS_CB) THEN
434 MAXI_CLUSTER=max(MAXI_CLUSTER_U+NELIM,MAXI_CLUSTER_L)
435 ELSE
436 MAXI_CLUSTER=max(MAXI_CLUSTER_U,MAXI_CLUSTER_L)
437 ENDIF
438 LWORK = MAXI_CLUSTER*MAXI_CLUSTER
439 OMP_NUM = 1
440#if defined(BLR_MT)
441!$ OMP_NUM = OMP_GET_MAX_THREADS()
442#endif
443 ALLOCATE(BLOCK(MAXI_CLUSTER, OMP_NUM*MAXI_CLUSTER),
444 & RWORK(2*MAXI_CLUSTER*OMP_NUM),
445 & TAU(MAXI_CLUSTER*OMP_NUM),
446 & JPVT(MAXI_CLUSTER*OMP_NUM),
447 & WORK(LWORK*OMP_NUM), stat=allocok)
448 IF (allocok > 0 ) THEN
449 IFLAG = -13
450 IERROR = MAXI_CLUSTER*OMP_NUM*MAXI_CLUSTER
451 & + 2*MAXI_CLUSTER*OMP_NUM
452 & + MAXI_CLUSTER*OMP_NUM
453 & + MAXI_CLUSTER*OMP_NUM
454 & + LWORK*OMP_NUM
455 LP = ICNTL(1)
456.LE. IF (ICNTL(4) 0) LP=-1
457 IF (LP > 0) WRITE(LP,*) MYID,
459 GOTO 700
460 ENDIF
461 CURRENT_BLR=1
462 ALLOCATE(BLR_L(NB_BLR_L), stat=allocok)
463 IF (allocok > 0 ) THEN
464 IFLAG = -13
465 IERROR = NB_BLR_L
466 LP = ICNTL(1)
467.LE. IF (ICNTL(4) 0) LP=-1
468 IF (LP > 0) WRITE(LP,*) MYID,
470 GOTO 700
471 ENDIF
472#if defined(BLR_MT)
473!$OMP PARALLEL
474#endif
475 CALL ZMUMPS_COMPRESS_PANEL_I_NOOPT
476 & (A_PTR(POSELT), LA_PTR, 1_8,
477 & IFLAG, IERROR, NCOL1,
478 & BEGS_BLR_L(1), size(BEGS_BLR_L), NB_BLR_L+1,
479 & DKEEP(8), KEEP(466), KEEP(473),
480 & BLR_L(1),
481 & CURRENT_BLR, 'v', WORK, TAU, JPVT, LWORK, RWORK,
482 & BLOCK, MAXI_CLUSTER, NELIM,
483 & .TRUE.,
484 & NPIV, NPIV1,
485 & 2, KEEP(483), KEEP8,
486 & OMP_NUM )
487#if defined(BLR_MT)
488!$OMP MASTER
489#endif
490.EQ. IF ( (KEEP(486)2)
491 & ) THEN
492 CALL ZMUMPS_BLR_SAVE_PANEL_LORU (
493 & IW(IOLDPS+XXF),
494 & 0,
495 & IPANEL, BLR_L)
496 ENDIF
497#if defined(BLR_MT)
498!$OMP END MASTER
499!$OMP BARRIER
500#endif
501.LT. IF (IFLAG0) GOTO 300
502.GE. IF (KEEP(475)1) THEN
503 CALL ZMUMPS_BLR_PANEL_LRTRSM(A, LA, POSBLOCFACTO,
504 & LD_BLOCFACTO, -6666,
505 & NB_BLR_L+1,
506 & BLR_L, CURRENT_BLR, CURRENT_BLR+1, NB_BLR_L+1,
507 & 2, 0, 0,
508 & .TRUE.)
509#if defined(BLR_MT)
510!$OMP BARRIER
511#endif
512.NE. IF (KEEP(486)2) THEN
513 CALL ZMUMPS_DECOMPRESS_PANEL_I_NOOPT(
514 & A_PTR(POSELT), LA_PTR, 1_8,
515 & NCOL1, NCOL1,
516 & .TRUE.,
517 & NPIV1+1,
518 & 1,
519 & NB_BLR_L+1, BLR_L(1), CURRENT_BLR, 'v', 1)
520 ENDIF
521 ENDIF
522 300 CONTINUE
523#if defined(BLR_MT)
524!$OMP END PARALLEL
525#endif
526.LT. IF (IFLAG0) GOTO 700
527 ENDIF
528 ENDIF
529.eq..AND. IF ( (KEEP(201)1)
530.OR..EQ. & (OOCWRITE_COMPATIBLE_WITH_BLR NPIV0) ) THEN
531 MonBloc%INODE = INODE
532 MonBloc%MASTER = .FALSE.
533 MonBloc%Typenode = 2
534 MonBloc%NROW = NROW1
535 MonBloc%NCOL = NCOL1
536 MonBloc%NFS = NASS1
537 MonBloc%LastPiv = NPIV1 + NPIV
538 MonBloc%LastPanelWritten_L = -9999
539 MonBloc%LastPanelWritten_U = -9999
540 NULLIFY(MonBloc%INDICES)
541 MonBloc%Last = LASTBL
542 STRAT = STRAT_TRY_WRITE
543 NextPivDummy = -8888
544 LIWFAC = IW(IOLDPS+XXI)
545 LAST_CALL = .FALSE.
546 CALL ZMUMPS_OOC_IO_LU_PANEL_I( STRAT, TYPEF_L,
547 & A_PTR(POSELT),
548 & LA_PTR, MonBloc, NextPivDummy, NextPivDummy,
549 & IW(IOLDPS), LIWFAC, MYID, KEEP8(31), IFLAG,LAST_CALL)
550 ENDIF
551.GT. IF ( (NPIV 0)
552 & ) THEN
553 IF (LR_ACTIVATED) THEN
554.GT. IF (NELIM0) THEN
555 UPOS = 1_8+int(NPIV,8)
556 CALL ZMUMPS_BLR_UPD_NELIM_VAR_L_I(
557 & A(POSBLOCFACTO), LA_BLOCFACTO, UPOS,
558 & A_PTR(POSELT), LA_PTR, LPOS-POSELT+1_8,
559 & IFLAG, IERROR, LD_BLOCFACTO, NCOL1,
560 & BEGS_BLR_L(1), size(BEGS_BLR_L),
561 & CURRENT_BLR, BLR_L(1), NB_BLR_L+1,
562 & CURRENT_BLR+1, NELIM, 'n')
563 ENDIF
564#if defined(BLR_MT)
565!$OMP PARALLEL
566#endif
567 CALL ZMUMPS_BLR_UPDATE_TRAILING_I(
568 & A_PTR(POSELT), LA_PTR, 1_8,
569 & IFLAG, IERROR, NCOL1,
570 & BEGS_BLR_L(1), size(BEGS_BLR_L),
571 & BEGS_BLR_U(1), size(BEGS_BLR_U), CURRENT_BLR,
572 & BLR_L(1), NB_BLR_L+1,
573 & BLR_U(1), NB_BLR_U+1,
574 & 0,
575 & .TRUE.,
576 & NPIV1,
577 & 2, 0,
578 & KEEP(481), DKEEP(11), KEEP(466), KEEP(477)
579 & )
580#if defined(BLR_MT)
581!$OMP END PARALLEL
582#endif
583.LT. IF (IFLAG0) GOTO 700
584 ELSE
585 UPOS = POSBLOCFACTO+int(NPIV,8)
586 CALL zgemm('n','n', NCOL-NPIV, NROW1, NPIV,
587 & ALPHA,A(UPOS), NCOL,
588 & A_PTR(LPOS2), NCOL1, ONE, A_PTR(LPOS), NCOL1)
589 ENDIF
590 ENDIF
591 IW(IOLDPS+KEEP(IXSZ) ) = IW(IOLDPS+KEEP(IXSZ) ) - NPIV
592 IW(IOLDPS + 3+KEEP(IXSZ) ) = IW(IOLDPS+3+KEEP(IXSZ) ) + NPIV
593 IF (LASTBL) THEN
594 IW(IOLDPS+1+KEEP(IXSZ) ) = IW(IOLDPS + 3+KEEP(IXSZ) )
595 ENDIF
596.not..AND. IF ( LASTBL
597.EQ. & (IW(IOLDPS+1+KEEP(IXSZ)) IW(IOLDPS + 3+KEEP(IXSZ))) ) THEN
598 write(*,*) 'internal error 1 **** in blacfacto '
599 CALL MUMPS_ABORT()
600 ENDIF
601 IF (LR_ACTIVATED) THEN
602.GT. IF ((NPIV0)
603 & ) THEN
604 CALL DEALLOC_BLR_PANEL( BLR_U, NB_BLR_U, KEEP8, KEEP(34))
605 DEALLOCATE(BLR_U)
606.EQ. IF (KEEP(486)3) THEN
607 CALL DEALLOC_BLR_PANEL( BLR_L, NB_BLR_L, KEEP8, KEEP(34))
608 DEALLOCATE(BLR_L)
609 ELSE
610 CALL UPD_MRY_LU_LRGAIN(BLR_L, NPARTSCB
611 & )
612 ENDIF
613 ENDIF
614 ENDIF
615 LRLU = LRLU + LA_BLOCFACTO
616 LRLUS = LRLUS + LA_BLOCFACTO
617 KEEP8(69) = KEEP8(69) - LA_BLOCFACTO
618 POSFAC = POSFAC - LA_BLOCFACTO
619 CALL ZMUMPS_LOAD_MEM_UPDATE(.FALSE.,.FALSE.,
620 & LA-LRLUS,0_8,-LA_BLOCFACTO,KEEP,KEEP8,LRLUS)
621 IWPOS = IWPOS - NPIV
622 FLOP1 = dble( NPIV1*NROW1 ) +
623 & dble(NROW1*NPIV1)*dble(2*NCOL1-NPIV1-1)
624 & -
625 & dble((NPIV1+NPIV)*NROW1 ) -
626 & dble(NROW1*(NPIV1+NPIV))*dble(2*NCOL1-NPIV1-NPIV-1)
627 CALL ZMUMPS_LOAD_UPDATE( 1, .FALSE., FLOP1, KEEP,KEEP8 )
628 IF (LASTBL) THEN
629.NE. IF (KEEP(486)0) THEN
630 IF (LR_ACTIVATED) THEN
631 CALL STATS_COMPUTE_FLOP_SLAVE_TYPE2(NROW1, NCOL1, NASS1,
632 & KEEP(50), INODE)
633 ELSE
634 CALL UPD_FLOP_FRFRONT_SLAVE(NROW1, NCOL1, NASS1,
635 & KEEP(50), INODE)
636 ENDIF
637 ENDIF
638 IF (LR_ACTIVATED) THEN
639 IF (COMPRESS_CB) THEN
640 CALL ZMUMPS_BLR_RETRIEVE_BEGS_BLR_C (IW(IOLDPS+XXF),
641 & BEGS_BLR_COL, NPARTSASS_MASTER_AUX)
642 BEGS_BLR_COL(1+NPARTSASS_MASTER) =
643 & BEGS_BLR_COL(1+NPARTSASS_MASTER) - NELIM
644 NB_BLR_COL = size(BEGS_BLR_COL) - 1
645.EQ. IF (NPIV0) THEN
646 call MAX_CLUSTER(BEGS_BLR_L,NB_BLR_L+1,MAXI_CLUSTER_L)
647 call MAX_CLUSTER(BEGS_BLR_COL,NB_BLR_COL,MAXI_CLUSTER_COL)
648 IF (COMPRESS_CB) THEN
649 MAXI_CLUSTER=max(MAXI_CLUSTER_COL+NELIM,MAXI_CLUSTER_L)
650 ELSE
651 MAXI_CLUSTER=max(MAXI_CLUSTER_COL,MAXI_CLUSTER_L)
652 ENDIF
653 LWORK = MAXI_CLUSTER*MAXI_CLUSTER
654 OMP_NUM = 1
655#if defined(BLR_MT)
656!$ OMP_NUM = OMP_GET_MAX_THREADS()
657#endif
658 ALLOCATE(BLOCK(MAXI_CLUSTER, OMP_NUM*MAXI_CLUSTER),
659 & RWORK(2*MAXI_CLUSTER*OMP_NUM),
660 & TAU(MAXI_CLUSTER*OMP_NUM),
661 & JPVT(MAXI_CLUSTER*OMP_NUM),
662 & WORK(LWORK*OMP_NUM), stat=allocok)
663 IF (allocok > 0 ) THEN
664 IFLAG = -13
665 IERROR = MAXI_CLUSTER*OMP_NUM*MAXI_CLUSTER
666 & + 2*MAXI_CLUSTER*OMP_NUM
667 & + MAXI_CLUSTER*OMP_NUM
668 & + MAXI_CLUSTER*OMP_NUM
669 & + LWORK*OMP_NUM
670 LP = ICNTL(1)
671.LE. IF (ICNTL(4) 0) LP=-1
672 IF (LP > 0) WRITE(LP,*) MYID,
674 GOTO 700
675 ENDIF
676 ENDIF
677 allocate(CB_LRB(NB_BLR_L,NB_BLR_COL-NPARTSASS_MASTER),
678 & stat=allocok)
679 IF (allocok > 0) THEN
680 IFLAG = -13
681 IERROR = NB_BLR_L*(NB_BLR_COL-NPARTSASS_MASTER)
682 GOTO 700
683 ENDIF
684 CALL ZMUMPS_BLR_SAVE_CB_LRB(IW(IOLDPS+XXF),CB_LRB)
685 ENDIF
686#if defined(BLR_MT)
687!$OMP PARALLEL
688#endif
689 IF (COMPRESS_CB) THEN
690 CALL ZMUMPS_COMPRESS_CB_I(
691 & A_PTR(POSELT), LA_PTR, 1_8, NCOL1,
692 & BEGS_BLR_L(1), size(BEGS_BLR_L),
693 & BEGS_BLR_COL(1), size(BEGS_BLR_COL),
694 & NB_BLR_L, NB_BLR_COL-NPARTSASS_MASTER,
695 & NPARTSASS_MASTER,
696 & NROW1, NCOL1-NPIV1-NPIV, INODE,
697 & IW(IOLDPS+XXF), 0, 2, IFLAG, IERROR,
698 & DKEEP(12), KEEP(466), KEEP(484), KEEP(489),
699 & CB_LRB(1,1),
700 & WORK, TAU, JPVT, LWORK, RWORK, BLOCK,
701 & MAXI_CLUSTER, KEEP8, OMP_NUM,
702 & -9999, -9999, -9999, KEEP(1),
703 & IDUMMY, 0, -9999 )
704#if defined(BLR_MT)
705!$OMP BARRIER
706#endif
707 ENDIF
708#if defined(BLR_MT)
709!$OMP END PARALLEL
710#endif
711.LT. IF (IFLAG0) GOTO 700
712 ENDIF
713 CALL ZMUMPS_END_FACTO_SLAVE(
714 & COMM_LOAD, ASS_IRECV,
715 & N, INODE, FPERE,
716 & root,
717 & MYID, COMM,
718 &
719 & BUFR, LBUFR, LBUFR_BYTES, PROCNODE_STEPS, POSFAC,
720 & IWPOS, IWPOSCB, IPTRLU, LRLU, LRLUS, IW, LIW, A, LA,
721 & PTRIST, PTLUST_S, PTRFAC, PTRAST, STEP, PIMASTER,
722 & PAMASTER,
723 & NSTK_S, COMP, IFLAG, IERROR, PERM,
724 & IPOOL, LPOOL, LEAF, NBFIN, SLAVEF,
725 & OPASSW, OPELIW, ITLOC, RHS_MUMPS, FILS, DAD, PTRARW, PTRAIW,
726 & INTARR, DBLARR,ICNTL,KEEP,KEEP8,DKEEP,ND, FRERE_STEPS,
727 & LPTRAR, NELT, FRTPTR, FRTELT,
728 & ISTEP_TO_INIV2, TAB_POS_IN_PERE
729 & , LRGROUPS
730 & )
731 ENDIF
732 IF (LR_ACTIVATED) THEN
733 IF (allocated(RWORK)) DEALLOCATE(RWORK)
734 IF (allocated(WORK)) DEALLOCATE(WORK)
735 IF (allocated(TAU)) DEALLOCATE(TAU)
736 IF (allocated(JPVT)) DEALLOCATE(JPVT)
737 IF (allocated(BLOCK)) DEALLOCATE(BLOCK)
738 IF (associated(BEGS_BLR_L)) THEN
739.NOT. IF ( KEEP_BEGS_BLR_L) DEALLOCATE(BEGS_BLR_L)
740 ENDIF
741.GT. IF ((NPIV0)
742 & ) THEN
743 IF (associated(BEGS_BLR_U)) DEALLOCATE(BEGS_BLR_U)
744 ENDIF
745 ENDIF
746 600 CONTINUE
747 RETURN
748 700 CONTINUE
749 CALL ZMUMPS_BDC_ERROR( MYID, SLAVEF, COMM, KEEP )
750 RETURN
subroutine zswap(n, zx, incx, zy, incy)
ZSWAP
subroutine ztrsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
ZTRSM
integer, public strat_try_write
subroutine get_cut(iwr, nass, ncb, lrgroups, npartscb, npartsass, cut)
subroutine zmumps_dm_set_dynptr(cb_state, a, la, pamaster_or_ptrast, ixxd, ixxr, son_a, iachk, recsize)
integer, save, private myid
double precision, save, private alpha
subroutine, public zmumps_load_mem_update(ssarbr, process_bande_arg, mem_value, new_lu, inc_mem_arg, keep, keep8, lrlus)
subroutine zmumps_asm_slave_arrowheads(inode, n, iw, liw, ioldps, a, la, poselt, keep, keep8, itloc, fils, ptraiw, ptrarw, intarr, dblarr, lintarr, ldblarr, rhs_mumps, lrgroups)
subroutine zmumps_asm_slave_elements(inode, n, nelt, iw, liw, ioldps, a, la, poselt, keep, keep8, itloc, fils, ptraiw, ptrarw, intarr, dblarr, lintarr, ldblarr, frt_ptr, frt_elt, rhs_mumps, lrgroups)
subroutine zmumps_get_size_needed(sizei_needed, sizer_needed, skip_top_stack, keep, keep8, n, iw, liw, a, la, lrlu, iptrlu, iwpos, iwposcb, ptrist, ptrast, step, pimaster, pamaster, lrlus, xsize, comp, acc_time, myid, slavef, procnode_steps, dad, iflag, ierror)
recursive subroutine zmumps_treat_descband(inode, comm_load, ass_irecv, 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, perm, ipool, lpool, leaf, nbfin, myid, slavef root, opassw, opeliw, itloc, rhs_mumps, fils, dad, ptrarw, ptraiw, intarr, dblarr, icntl, keep, keep8, dkeep, nd, frere, lptrar, nelt, frtptr, frtelt istep_to_iniv2, tab_pos_in_pere, stack_right_authorized, lrgroups)
subroutine zmumps_mpi_unpack_lr(bufr, lbufr, lbufr_bytes, position, npiv, nelim, dir, blr_u, nb_block_u, begs_blr_u, keep8, comm, ierr, iflag, ierror)
recursive subroutine zmumps_process_blocfacto(comm_load, ass_irecv, bufr, lbufr, lbufr_bytes, procnode_steps, msgsou, slavef, iwpos, iwposcb, iptrlu, lrlu, lrlus, n, iw, liw, a, la, ptrist, ptrast, nstk_s, perm, comp, step, pimaster, pamaster, posfac, myid, comm, iflag, ierror, nbfin ptlust_s, ptrfac, root, opassw, opeliw, itloc, rhs_mumps, fils, dad, ptrarw, ptraiw, intarr, dblarr, icntl, keep, keep8, dkeep, ipool, lpool, leaf, nd, frere_steps, lptrar, nelt, frtptr, frtelt, istep_to_iniv2, tab_pos_in_pere, lrgroups)
recursive subroutine zmumps_try_recvtreat(comm_load, ass_irecv, blocking, set_irecv, message_received, msgsou, msgtag, status, 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, perm, ipool, lpool, leaf, nbfin, myid, slavef root, opassw, opeliw, itloc, rhs_mumps, fils, dad, ptrarw, ptraiw, intarr, dblarr, icntl, keep, keep8, dkeep, nd, frere, lptrar, nelt, frtptr, frtelt istep_to_iniv2, tab_pos_in_pere, stack_right_authorized, lrgroups)