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,
27 & IPOOL, LPOOL, LEAF, ND, FRERE_STEPS,
28 & LPTRAR, NELT, FRTPTR, FRTELT,
29 & ISTEP_TO_INIV2, TAB_POS_IN_PERE
45 include
'mumps_headers.h'
46 TYPE (smumps_root_struc) :: root
47 INTEGER icntl( 60 ), keep( 500 )
50 INTEGER lbufr, lbufr_bytes
51 INTEGER comm_load, ass_irecv
53 INTEGER n, slavef, iwpos, iwposcb, liw
54 INTEGER(8) :: iptrlu, lrlu, lrlus, la
57 INTEGER iflag, ierror, nbfin, msgsou
58 INTEGER procnode_steps(keep(28)), ptrist(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),
67 INTEGER,
intent(in) :: lrgroups(n)
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 REAL :: rhs_mumps(keep(255))
74 INTEGER(8),
INTENT(IN) :: ( lptrar ), ptrarw( lptrar )
75 INTEGER frere_steps(keep(28))
76 DOUBLE PRECISION opassw, opeliw
77 DOUBLE PRECISION flop1
78 INTEGER intarr( keep8(27) )
79 REAL dblarr( keep8(26) )
81 INTEGER ipool( lpool )
82 INTEGER istep_to_iniv2(keep(71)),
83 & tab_pos_in_pere(slavef+2,
max(1,keep(56)))
85 INCLUDE 'mumps_tags.h
'
86 INTEGER :: STATUS(MPI_STATUS_SIZE)
87 LOGICAL :: I_HAVE_SET_K117
88 INTEGER INODE, POSITION, NPIV, IERR, LP
90 INTEGER(8) :: POSBLOCFACTO
91 INTEGER :: LD_BLOCFACTO
92 INTEGER(8) :: LA_BLOCFACTO
95 REAL, 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
100 INTEGER I, IPIV, FPERE
101 LOGICAL LASTBL, KEEP_BEGS_BLR_L
102 LOGICAL BLOCKING, SET_IRECV, MESSAGE_RECEIVED
104 PARAMETER (ONE = 1.0E0, ALPHA=-1.0E0)
105 INTEGER LIWFAC, STRAT, NextPivDummy
106 TYPE(IO_BLOCK) :: MonBloc
109 INTEGER :: INFO_TMP(2)
111 INTEGER :: NELIM, NPARTSASS_MASTER, NPARTSASS_MASTER_AUX,
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 :: LR_ACTIVATED_INT
120 INTEGER, POINTER, DIMENSION(:) :: BEGS_BLR_L, BEGS_BLR_U,
122 REAL, ALLOCATABLE, DIMENSION(:) :: WORK, TAU
123 INTEGER, ALLOCATABLE, DIMENSION(:) :: JPVT
124 REAL,ALLOCATABLE,DIMENSION(:) :: RWORK
125 REAL, ALLOCATABLE, DIMENSION(:,:) :: BLOCK
127 INTEGER NPARTSASS, NPARTSCB, MAXI_CLUSTER, LWORK,
128 & MAXI_CLUSTER_L, MAXI_CLUSTER_U, MAXI_CLUSTER_COL
130 INTEGER MUMPS_PROCNODE
131 EXTERNAL MUMPS_PROCNODE
132 KEEP_BEGS_BLR_L = .FALSE.
136 I_HAVE_SET_K117 = .FALSE.
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 )
146 CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION, FPERE, 1,
147 & MPI_INTEGER, COMM, IERR )
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 )
153 CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
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.EQ.
LR_ACTIVATED = (LR_ACTIVATED_INT1)
161 IF ( LR_ACTIVATED ) THEN
162 LA_BLOCFACTO = int(NPIV,8) * int(NPIV+NELIM,8)
164 LA_BLOCFACTO = int(NPIV,8) * int(NCOL,8)
166 CALL SMUMPS_GET_SIZE_NEEDED(
167 & NPIV, LA_BLOCFACTO, .FALSE.,
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.LT.
IF (IFLAG0) 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
183 CALL SMUMPS_LOAD_MEM_UPDATE(.FALSE., .FALSE.,
184 & LA-LRLUS,0_8,LA_BLOCFACTO,KEEP,KEEP8,LRLUS)
192 CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
194 & MPI_INTEGER, COMM, IERR )
196 IF ( LR_ACTIVATED ) THEN
197 CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
198 & A(POSBLOCFACTO), NPIV*(NPIV+NELIM),
201 LD_BLOCFACTO = NPIV+NELIM
202 CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
203 & NB_BLR_U, 1, MPI_INTEGER,
205 ALLOCATE(BLR_U(max(NB_BLR_U,1)), stat=allocok)
206 IF (allocok > 0 ) THEN
208 IERROR = max(NB_BLR_U,1)
210.LE.
IF (ICNTL(4) 0) LP=-1
211 IF (LP > 0) WRITE(LP,*) MYID,
215 ALLOCATE(BEGS_BLR_U(NB_BLR_U+2), stat=allocok)
216 IF (allocok > 0 ) THEN
220.LE.
IF (ICNTL(4) 0) LP=-1
221 IF (LP > 0) WRITE(LP,*) MYID,
225 CALL SMUMPS_MPI_UNPACK_LR(BUFR, LBUFR, LBUFR_BYTES,
226 & POSITION, NPIV, NELIM, 'h
',
227 & BLR_U(1), NB_BLR_U,
229 & KEEP8, COMM, IERR, IFLAG, IERROR)
230.LT.
IF (IFLAG0) GOTO 700
232 CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
233 & A(POSBLOCFACTO), NPIV*NCOL,
239 CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
241 & MPI_INTEGER, COMM, IERR )
242.EQ.
IF (PTRIST(STEP( INODE )) 0) THEN
243 CALL SMUMPS_TREAT_DESCBAND( INODE, COMM_LOAD,
245 & BUFR, LBUFR, LBUFR_BYTES, PROCNODE_STEPS, POSFAC,
246 & IWPOS, IWPOSCB, IPTRLU,
247 & LRLU, LRLUS, N, IW, LIW, A, LA, PTRIST,
249 & PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP,
250 & IFLAG, IERROR, COMM,
251 & PERM, IPOOL, LPOOL, LEAF, NBFIN, MYID, SLAVEF,
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.
260.LT.
IF ( IFLAG 0 ) GOTO 600
262.EQ.
IF ( IW( PTRIST(STEP(INODE)) + 3 +KEEP(IXSZ)) 0 ) THEN
263.NE.
DO WHILE ( IW(PTRIST(STEP(INODE)) + XXNBPR) 0)
266 MESSAGE_RECEIVED = .FALSE.
267 CALL SMUMPS_TRY_RECVTREAT( COMM_LOAD,
268 & ASS_IRECV, BLOCKING, SET_IRECV, MESSAGE_RECEIVED,
269 & MPI_ANY_SOURCE, CONTRIB_TYPE2,
271 & BUFR, LBUFR, LBUFR_BYTES, PROCNODE_STEPS, POSFAC,
272 & IWPOS, IWPOSCB, IPTRLU,
273 & LRLU, LRLUS, N, IW, LIW, A, LA, PTRIST,
275 & PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP,
276 & IFLAG, IERROR, COMM,
277 & PERM, IPOOL, LPOOL, LEAF, NBFIN, MYID, SLAVEF,
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.
286.LT.
IF ( IFLAG 0 ) GOTO 600
291 MESSAGE_RECEIVED = .TRUE.
292 CALL SMUMPS_TRY_RECVTREAT( COMM_LOAD, ASS_IRECV,
293 & BLOCKING, SET_IRECV, MESSAGE_RECEIVED,
294 & MPI_ANY_SOURCE, MPI_ANY_TAG,
296 & BUFR, LBUFR, LBUFR_BYTES, PROCNODE_STEPS, POSFAC,
297 & IWPOS, IWPOSCB, IPTRLU,
298 & LRLU, LRLUS, N, IW, LIW, A, LA, PTRIST,
300 & PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP,
301 & IFLAG, IERROR, COMM,
302 & PERM, IPOOL, LPOOL, LEAF, NBFIN, MYID, SLAVEF,
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.
311 IOLDPS = PTRIST(STEP(INODE))
312 CALL SMUMPS_DM_SET_DYNPTR( IW(IOLDPS+XXS), A, LA,
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.GE.
COMPRESS_PANEL = (IW(IOLDPS+XXLR)2)
318 OOCWRITE_COMPATIBLE_WITH_BLR =
319.NOT..OR..NOT..OR.
& ( LR_ACTIVATED (COMPRESS_PANEL)
322 IF ( NASS1 < 0 ) THEN
324 IW( IOLDPS + 1 + KEEP(IXSZ)) = NASS1
325.EQ.
IF (KEEP(55) 0) THEN
326 CALL SMUMPS_ASM_SLAVE_ARROWHEADS(INODE, N, IW, LIW,
327 & IOLDPS, A_PTR(POSELT), LA_PTR, 1_8, KEEP, KEEP8, ITLOC,
329 & PTRARW, INTARR, DBLARR, KEEP8(27), KEEP8(26), RHS_MUMPS,
332 CALL SMUMPS_ASM_SLAVE_ELEMENTS(INODE, N, NELT, IW, LIW,
333 & IOLDPS, A_PTR(POSELT), LA_PTR, 1_8, KEEP, KEEP8, ITLOC,
335 & PTRARW, INTARR, DBLARR, KEEP8(27), KEEP8(26),
336 & FRTPTR, FRTELT, RHS_MUMPS, LRGROUPS)
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
345 ICT11 = IOLDPS+HS+NROW1+NPIV1 - 1
347.EQ.
IF (IW(IPIV+I-1)I) CYCLE
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 sswap(NROW1, A_PTR(IPOS), NCOL1, A_PTR(KPOS), NCOL1)
355 LPOS2 = POSELT + int(NPIV1,8)
356 LPOS = LPOS2 + int(NPIV,8)
357.NOT..OR..EQ.
IF (( LR_ACTIVATED)KEEP(475)0) THEN
358 CALL strsm('l
','l
','n
','n
', NPIV, NROW1, ONE,
359 & A(POSBLOCFACTO), LD_BLOCFACTO,
360 & A_PTR(LPOS2), NCOL1)
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
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))
381.EQ.
IF (IPANEL1) THEN
382 BEGS_BLR_COL=>BEGS_BLR_U
384 ALLOCATE(BEGS_BLR_COL(size(BEGS_BLR_U)+IPANEL-1),
386 IF (allocok > 0 ) THEN
388 IERROR = size(BEGS_BLR_U)+IPANEL-1
390.LE.
IF (ICNTL(4) 0) LP=-1
391 IF (LP > 0) WRITE(LP,*) MYID,
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)
402.LT.
IF (IFLAG0) GOTO 700
403 CALL SMUMPS_BLR_SAVE_INIT(IW(IOLDPS+XXF),
410 & huge(NPARTSASS_MASTER),
414.NE.
IF (IPANEL1) THEN
415 DEALLOCATE(BEGS_BLR_COL)
417.LT.
IF (IFLAG0) GOTO 700
419 CALL SMUMPS_BLR_RETRIEVE_BEGS_BLR_L (IW(IOLDPS+XXF),
421 KEEP_BEGS_BLR_L = .TRUE.
422 NB_BLR_L = size(BEGS_BLR_L) - 2
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)
436 MAXI_CLUSTER=max(MAXI_CLUSTER_U,MAXI_CLUSTER_L)
438 LWORK = MAXI_CLUSTER*MAXI_CLUSTER
441!$ OMP_NUM = OMP_GET_MAX_THREADS()
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
450 IERROR = MAXI_CLUSTER*OMP_NUM*MAXI_CLUSTER
451 & + 2*MAXI_CLUSTER*OMP_NUM
452 & + MAXI_CLUSTER*OMP_NUM
453 & + MAXI_CLUSTER*OMP_NUM
456.LE.
IF (ICNTL(4) 0) LP=-1
457 IF (LP > 0) WRITE(LP,*) MYID,
462 ALLOCATE(BLR_L(NB_BLR_L), stat=allocok)
463 IF (allocok > 0 ) THEN
467.LE.
IF (ICNTL(4) 0) LP=-1
468 IF (LP > 0) WRITE(LP,*) MYID,
475 CALL SMUMPS_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),
481 & CURRENT_BLR, 'v
', WORK, TAU, JPVT, LWORK, RWORK,
482 & BLOCK, MAXI_CLUSTER, NELIM,
485 & 2, KEEP(483), KEEP8,
490.EQ.
IF ( (KEEP(486)2)
492 CALL SMUMPS_BLR_SAVE_PANEL_LORU (
501.LT.
IF (IFLAG0) GOTO 300
502.GE.
IF (KEEP(475)1) THEN
503 CALL SMUMPS_BLR_PANEL_LRTRSM(A, LA, POSBLOCFACTO,
504 & LD_BLOCFACTO, -6666,
506 & BLR_L, CURRENT_BLR, CURRENT_BLR+1, NB_BLR_L+1,
512.NE.
IF (KEEP(486)2) THEN
513 CALL SMUMPS_DECOMPRESS_PANEL_I_NOOPT(
514 & A_PTR(POSELT), LA_PTR, 1_8,
519 & NB_BLR_L+1, BLR_L(1), CURRENT_BLR, 'v
', 1)
526.LT.
IF (IFLAG0) GOTO 700
529.eq..AND.
IF ( (KEEP(201)1)
530.OR..EQ.
& (OOCWRITE_COMPATIBLE_WITH_BLR NPIV0) ) THEN
531 MonBloc%INODE = INODE
532 MonBloc%MASTER = .FALSE.
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
544 LIWFAC = IW(IOLDPS+XXI)
546 CALL SMUMPS_OOC_IO_LU_PANEL_I( STRAT, TYPEF_L,
548 & LA_PTR, MonBloc, NextPivDummy, NextPivDummy,
549 & IW(IOLDPS), LIWFAC, MYID, KEEP8(31), IFLAG,LAST_CALL)
553 IF (LR_ACTIVATED) THEN
555 UPOS = 1_8+int(NPIV,8)
556 CALL SMUMPS_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
')
567 CALL SMUMPS_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,
578 & KEEP(481), DKEEP(11), KEEP(466), KEEP(477)
583.LT.
IF (IFLAG0) GOTO 700
585 UPOS = POSBLOCFACTO+int(NPIV,8)
586 CALL sgemm('n
','n
', NCOL-NPIV, NROW1, NPIV,
587 & ALPHA,A(UPOS), NCOL,
588 & A_PTR(LPOS2), NCOL1, ONE, A_PTR(LPOS), NCOL1)
591 IW(IOLDPS+KEEP(IXSZ) ) = IW(IOLDPS+KEEP(IXSZ) ) - NPIV
592 IW(IOLDPS + 3+KEEP(IXSZ) ) = IW(IOLDPS+3+KEEP(IXSZ) ) + NPIV
594 IW(IOLDPS+1+KEEP(IXSZ) ) = IW(IOLDPS + 3+KEEP(IXSZ) )
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
'
601 IF (LR_ACTIVATED) THEN
604 CALL DEALLOC_BLR_PANEL( BLR_U, NB_BLR_U, KEEP8, KEEP(34))
606.EQ.
IF (KEEP(486)3) THEN
607 CALL DEALLOC_BLR_PANEL( BLR_L, NB_BLR_L, KEEP8, KEEP(34))
610 CALL UPD_MRY_LU_LRGAIN(BLR_L, NPARTSCB
615 LRLU = LRLU + LA_BLOCFACTO
616 LRLUS = LRLUS + LA_BLOCFACTO
617 KEEP8(69) = KEEP8(69) - LA_BLOCFACTO
618 POSFAC = POSFAC - LA_BLOCFACTO
619 CALL SMUMPS_LOAD_MEM_UPDATE(.FALSE.,.FALSE.,
620 & LA-LRLUS,0_8,-LA_BLOCFACTO,KEEP,KEEP8,LRLUS)
622 FLOP1 = dble( NPIV1*NROW1 ) +
623 & dble(NROW1*NPIV1)*dble(2*NCOL1-NPIV1-1)
625 & dble((NPIV1+NPIV)*NROW1 ) -
626 & dble(NROW1*(NPIV1+NPIV))*dble(2*NCOL1-NPIV1-NPIV-1)
627 CALL SMUMPS_LOAD_UPDATE( 1, .FALSE., FLOP1, KEEP,KEEP8 )
629.NE.
IF (KEEP(486)0) THEN
630 IF (LR_ACTIVATED) THEN
631 CALL STATS_COMPUTE_FLOP_SLAVE_TYPE2(NROW1, NCOL1, NASS1,
634 CALL UPD_FLOP_FRFRONT_SLAVE(NROW1, NCOL1, NASS1,
638 IF (LR_ACTIVATED) THEN
639 IF (COMPRESS_CB) THEN
640 CALL SMUMPS_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
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)
651 MAXI_CLUSTER=max(MAXI_CLUSTER_COL,MAXI_CLUSTER_L)
653 LWORK = MAXI_CLUSTER*MAXI_CLUSTER
656!$ OMP_NUM = OMP_GET_MAX_THREADS()
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
665 IERROR = MAXI_CLUSTER*OMP_NUM*MAXI_CLUSTER
666 & + 2*MAXI_CLUSTER*OMP_NUM
667 & + MAXI_CLUSTER*OMP_NUM
668 & + MAXI_CLUSTER*OMP_NUM
671.LE.
IF (ICNTL(4) 0) LP=-1
672 IF (LP > 0) WRITE(LP,*) MYID,
677 allocate(CB_LRB(NB_BLR_L,NB_BLR_COL-NPARTSASS_MASTER),
679 IF (allocok > 0) THEN
681 IERROR = NB_BLR_L*(NB_BLR_COL-NPARTSASS_MASTER)
684 CALL SMUMPS_BLR_SAVE_CB_LRB(IW(IOLDPS+XXF),CB_LRB)
689 IF (COMPRESS_CB) THEN
690 CALL SMUMPS_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,
696 & NROW1, NCOL1-NPIV1-NPIV, INODE,
697 & IW(IOLDPS+XXF), 0, 2, IFLAG, IERROR,
698 & DKEEP(12), KEEP(466), KEEP(484), KEEP(489),
700 & WORK, TAU, JPVT, LWORK, RWORK, BLOCK,
701 & MAXI_CLUSTER, KEEP8, OMP_NUM,
702 & -9999, -9999, -9999, KEEP(1),
711.LT.
IF (IFLAG0) GOTO 700
713 CALL SMUMPS_END_FACTO_SLAVE(
714 & COMM_LOAD, ASS_IRECV,
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,
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
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)
743 IF (associated(BEGS_BLR_U)) DEALLOCATE(BEGS_BLR_U)
749 CALL SMUMPS_BDC_ERROR( MYID, SLAVEF, COMM, KEEP )
recursive subroutine smumps_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)