17 & N, INODE, IW, LIW, A,
19 & IOLDPS, POSELT, IFLAG, IERROR, UU,
20 & NOFFW, NPVW, NBTINYW,
21 & DET_EXPW, DET_MANTW, DET_SIGNW,
23 & PROCNODE_STEPS, MYID, SLAVEF, SEUIL,
24 & AVOID_DELAYED, ETATASS,
25 & DKEEP,PIVNUL_LIST,LPN_LIST,
41 INTEGER(8) :: LA, POSELT
42 INTEGER , , LIW, IFLAG, IERROR
43 INTEGER,
INTENT(INOUT) :: NOFFW, NPVW, NBTINYW
44 INTEGER,
INTENT(INOUT) :: DET_EXPW, DET_SIGNW
45 COMPLEX,
INTENT(INOUT) :: DET_MANTW
48 INTEGER MYID, SLAVEF, IOLDPS
51 INTEGER ( KEEP(28) ), STEP()
54 INTEGER ETATASS, IWPOS
56 INTEGER PIVNUL_LIST(LPN_LIST)
58 INTEGER :: LRGROUPS(N), (N)
59 INTEGER INOPV, IFINB, NFRONT, NPIV, IBEG_BLOCK, IEND_BLOCK
60 INTEGER NASS, NBKJIB_ORIG, XSIZE
61 INTEGER NBLR_ORIG, IBEG_BLR, IEND_BLR
63 INTEGER LAST_ROW, LAST_COL, FIRST_COL
64 LOGICAL CALL_LTRSM, CALL_UTRSM
71 INTEGER LIWFAC, STRAT, ,
72 & unextpiv2bewritten, iflag_ooc,
73 & pp_first2swap_l, pp_first2swap_u,
74 & pp_lastpivrptrfilled_l,
75 & pp_lastpivrptrfilled_u
77 TYPE(io_block) :: MonBloc
82 LOGICAL COMPRESS_CB, COMPRESS_PANEL
83 LOGICAL OOCWRITE_COMPATIBLE_WITH_BLR,
84 & ooc_effective_on_front,
85 & ooc_eff_and_write_bypanel
87 INTEGER FIRST_BLOCK, LAST_BLOCK
88 INTEGER INFO_TMP(2), MAXI_RANK
89 INTEGER HF, NPARTSASS, NPARTSCB, NB_BLR
90 INTEGER MAXI_CLUSTER, LWORK, NELIM, NELIM_LOC
91 INTEGER :: IROW_L, NVSCHUR
92 INTEGER,
POINTER,
DIMENSION(:) :: PTDummy
93 INTEGER,
POINTER,
DIMENSION(:) :: BEGS_BLR
94 TYPE(
lrb_type),
POINTER,
DIMENSION(:,:) :: CB_LRB
95 TYPE(
lrb_type),
POINTER,
DIMENSION(:) :: ACC_LUA
96 TYPE(
lrb_type),
POINTER,
DIMENSION(:) :: , BLR_L
97 INTEGER,
POINTER,
DIMENSION(:) :: BEGS_BLR_TMP
98 TYPE(LRB_TYPE),
POINTER,
DIMENSION(:) :: BLR_PANEL
99 COMPLEX,
POINTER,
DIMENSION(:) :: DIAG
100 INTEGER :: DIAGSIZ_STA, DIAGSIZ_DYN, DPOS, LorU, I, MEM, MEM_TOT
101 INTEGER(8) :: POSELT_DIAG
102 CHARACTER(len=1) :: DIR
103 COMPLEX,
ALLOCATABLE :: WORK(:), TAU(:)
104 INTEGER,
ALLOCATABLE :: JPVT(:)
105 REAL,
ALLOCATABLE :: RWORK(:)
106 COMPLEX,
ALLOCATABLE :: BLOCK(:,:)
110 INTEGER(8) :: UPOS, LPOS
112 TYPE(
lrb_type),
POINTER,
DIMENSION(:) :: NEXT_BLR_U, NEXT_BLR_L
113 INTEGER,
POINTER,
DIMENSION(:) :: BEGS_BLR_STATIC
115 parameter(zero=(0.0e0,0.0e0))
116 include 'mumps_headers.h
'
120.GE.
IF (KEEP(206)1) THEN
127.EQ.
IF(KEEP(97) 0) THEN
132 IF (AVOID_DELAYED) THEN
135 SEUIL_LOC = max(SEUIL,epsilon(SEUIL))
139 PIVOT_OPTION = KEEP(468)
140 LRTRSM_OPTION = KEEP(475)
143 NFRONT = IW(IOLDPS+XSIZE)
144 NASS = iabs(IW(IOLDPS+2+XSIZE))
145 IW(IOLDPS+3+XSIZE) = -99999
146 LR_ACTIVATED = .FALSE.
147 COMPRESS_PANEL = .FALSE.
148 COMPRESS_CB = .FALSE.
155 NULLIFY(BEGS_BLR_TMP)
158.GE.
COMPRESS_PANEL = (IW(IOLDPS+XXLR)2)
159.EQ..OR.
COMPRESS_CB = ((IW(IOLDPS+XXLR)1)
160.EQ.
& (IW(IOLDPS+XXLR)3))
161.GT.
LR_ACTIVATED = (IW(IOLDPS+XXLR)0)
162.AND..NOT.
IF (COMPRESS_CB(COMPRESS_PANEL)) THEN
168 OOCWRITE_COMPATIBLE_WITH_BLR =
169.NOT..OR..NOT..OR.
& ( LR_ACTIVATED(COMPRESS_PANEL)
172.EQ..AND.
OOC_EFFECTIVE_ON_FRONT= ((KEEP(201)1)
173 & OOCWRITE_COMPATIBLE_WITH_BLR)
174 CALL CMUMPS_SET_PARPIVT1 ( INODE, NFRONT, NASS, KEEP,
175 & LR_ACTIVATED, PARPIV_T1)
176.EQ.
IF (UUTEMPZERO) THEN
178.NE.
ELSE IF (PARPIV_T10) THEN
179 PIVOT_OPTION = min(PIVOT_OPTION,2)
181 IF (LR_ACTIVATED) THEN
182.EQ.
IF (LRTRSM_OPTION3) THEN
183 PIVOT_OPTION = MIN(PIVOT_OPTION,1)
184.EQ.
ELSEIF (LRTRSM_OPTION2) THEN
185 PIVOT_OPTION = MIN(PIVOT_OPTION, 2)
188.LE.
IF (PIVOT_OPTION1) THEN
191.LT.
IF (NASSKEEP(4)) THEN
193.GT.
ELSE IF (NASS KEEP(3)) THEN
194 NBKJIB_ORIG = min( KEEP(6), NASS )
196 NBKJIB_ORIG = min( KEEP(5), NASS )
198.not.
IF (LR_ACTIVATED) THEN
199 NBLR_ORIG = KEEP(420)
203.EQ..AND.
IF ((KEEP(114)1)
204.GT..AND..GT.
& (KEEP(116)0) ((NFRONT-NASS-KEEP(253))0)
206 IROW_L = IOLDPS+6+XSIZE+NASS
207 CALL CMUMPS_GET_SIZE_SCHUR_IN_FRONT (
209 & NFRONT-NASS-KEEP(253),
219 CALL MUMPS_GETI8(LAFAC,IW(IOLDPS+XXR))
220 LIWFAC = IW(IOLDPS+XXI)
221 IF ( OOC_EFFECTIVE_ON_FRONT ) THEN
222 LNextPiv2beWritten = 1
223 UNextPiv2beWritten = 1
224 PP_FIRST2SWAP_L = LNextPiv2beWritten
225 PP_FIRST2SWAP_U = UNextPiv2beWritten
226 MonBloc%LastPanelWritten_L = 0
227 MonBloc%LastPanelWritten_U = 0
228 PP_LastPIVRPTRFilled_L = 0
229 PP_LastPIVRPTRFilled_U = 0
230 MonBloc%INODE = INODE
231 MonBloc%MASTER = .TRUE.
233 MonBloc%NROW = NFRONT
234 MonBloc%NCOL = NFRONT
236 MonBloc%Last = .FALSE.
237 MonBloc%LastPiv = -88877
238 NULLIFY(MonBloc%INDICES)
240 IF (LR_ACTIVATED) THEN
241.EQ.
IF (KEEP(405) 1) THEN
243 CNT_NODES = CNT_NODES + 1
246 CNT_NODES = CNT_NODES + 1
248.NE.
ELSE IF (KEEP(486)0) THEN
250.GE..AND.
OOC_EFF_AND_WRITE_BYPANEL = ( (PIVOT_OPTION3)
251 & OOC_EFFECTIVE_ON_FRONT )
252 HF = 6 + IW(IOLDPS+5+XSIZE)+XSIZE
253 IF (LR_ACTIVATED) THEN
254 CALL GET_CUT(IW(IOLDPS+HF:IOLDPS+HF+NFRONT-1), NASS,
255 & NFRONT-NASS, LRGROUPS, NPARTSCB,
256 & NPARTSASS, BEGS_BLR)
257 CALL REGROUPING2(BEGS_BLR, NPARTSASS, NASS, NPARTSCB,
258 & NFRONT-NASS, KEEP(488), .FALSE., KEEP(472))
259 NB_BLR = NPARTSASS + NPARTSCB
260 call MAX_CLUSTER(BEGS_BLR,NB_BLR,MAXI_CLUSTER)
261 MAXI_RANK = KEEP(479)*MAXI_CLUSTER
262 LWORK = MAXI_CLUSTER*MAXI_CLUSTER
265!$ OMP_NUM = OMP_GET_MAX_THREADS()
267 ALLOCATE(BLOCK(MAXI_CLUSTER, OMP_NUM*MAXI_CLUSTER),
268 & RWORK(2*MAXI_CLUSTER*OMP_NUM),
269 & TAU(MAXI_CLUSTER*OMP_NUM),
270 & JPVT(MAXI_CLUSTER*OMP_NUM),
271 & WORK(LWORK*OMP_NUM),
273 IF (allocok > 0) THEN
275 IERROR = OMP_NUM*(LWORK + MAXI_CLUSTER*(MAXI_CLUSTER+4))
278 ALLOCATE(ACC_LUA(OMP_NUM),stat=allocok)
279 IF (allocok > 0) THEN
284.GE.
IF (KEEP(480)3) THEN
286 CALL ALLOC_LRB(ACC_LUA(MY_NUM), MAXI_RANK,
287 & MAXI_CLUSTER, MAXI_CLUSTER, .TRUE.,
288 & IFLAG, IERROR, KEEP8)
289.LT.
IF (IFLAG0) GOTO 490
290 ACC_LUA(MY_NUM)%K = 0
294.AND.
IF (LR_ACTIVATED
304 CALL CMUMPS_BLR_SAVE_INIT(IW(IOLDPS+XXF),
314.LT.
IF (IFLAG0) GOTO 500
316.AND..GT.
IF (COMPRESS_CBNPARTSCB0) THEN
317 allocate(CB_LRB(NPARTSCB,NPARTSCB),stat=allocok)
318 IF (allocok > 0) THEN
320 IERROR = NPARTSCB*NPARTSCB
323 CALL CMUMPS_BLR_SAVE_CB_LRB(IW(IOLDPS+XXF),CB_LRB)
325 DO WHILE (IEND_BLR < NASS )
326 CURRENT_BLR = CURRENT_BLR + 1
327 IBEG_BLR = IW(IOLDPS+1+KEEP(IXSZ)) + 1
328.NOT.
IF ( LR_ACTIVATED) THEN
329 IEND_BLR = min(IEND_BLR + NBLR_ORIG, NASS)
331 IEND_BLR = BEGS_BLR(CURRENT_BLR+1)-1
332 BEGS_BLR( CURRENT_BLR ) = IBEG_BLR
333.GT.
IF ( IEND_BLR - IBEG_BLR + 1 MAXI_CLUSTER ) THEN
334 MAXI_CLUSTER = IEND_BLR - IBEG_BLR + 1
335 LWORK = MAXI_CLUSTER*MAXI_CLUSTER
336 DEALLOCATE(BLOCK, WORK, RWORK, TAU, JPVT)
337 ALLOCATE(BLOCK(MAXI_CLUSTER, OMP_NUM*MAXI_CLUSTER),
338 & RWORK(2*MAXI_CLUSTER*OMP_NUM),
339 & TAU(MAXI_CLUSTER*OMP_NUM),
340 & JPVT(MAXI_CLUSTER*OMP_NUM),
341 & WORK(LWORK*OMP_NUM),stat=allocok)
342 IF (allocok > 0) THEN
344 IERROR = OMP_NUM*(LWORK + MAXI_CLUSTER*(MAXI_CLUSTER+4))
347.GE.
IF (KEEP(480)3) THEN
349 CALL DEALLOC_LRB(ACC_LUA(MY_NUM), KEEP8, KEEP(34))
350 CALL ALLOC_LRB(ACC_LUA(MY_NUM), MAXI_RANK,
351 & MAXI_CLUSTER, MAXI_CLUSTER, .TRUE.,
352 & IFLAG, IERROR, KEEP8)
353.LT.
IF (IFLAG0) GOTO 500
354 ACC_LUA(MY_NUM)%K = 0
359 IF (LR_ACTIVATED) THEN
360.GE.
IF (KEEP(480)5) THEN
361.EQ.
IF (CURRENT_BLR1) THEN
362 ALLOCATE(BLR_U(NB_BLR-CURRENT_BLR),stat=allocok)
363 IF (allocok > 0) THEN
365 IERROR = NB_BLR-CURRENT_BLR
368 ALLOCATE(BLR_L(NB_BLR-CURRENT_BLR),stat=allocok)
369 IF (allocok > 0) THEN
371 IERROR = NB_BLR-CURRENT_BLR
374.GT.
IF (NB_BLRCURRENT_BLR) THEN
375 BLR_U(1:NB_BLR-CURRENT_BLR)%ISLR=.FALSE.
376 CALL CMUMPS_BLR_SAVE_PANEL_LORU (
379 & CURRENT_BLR, BLR_U)
380 BLR_L(1:NB_BLR-CURRENT_BLR)%ISLR=.FALSE.
381 CALL CMUMPS_BLR_SAVE_PANEL_LORU (
384 & CURRENT_BLR, BLR_L)
387.GT.
IF (NB_BLRCURRENT_BLR) THEN
388 CALL CMUMPS_BLR_RETRIEVE_PANEL_LORU(
391 & CURRENT_BLR, BLR_U)
392 CALL CMUMPS_BLR_RETRIEVE_PANEL_LORU(
395 & CURRENT_BLR, BLR_L)
398.LT.
IF (CURRENT_BLRNPARTSASS) THEN
399 ALLOCATE(NEXT_BLR_U(NB_BLR-CURRENT_BLR-1),stat=allocok)
400 IF (allocok > 0) THEN
402 IERROR = NB_BLR-CURRENT_BLR-1
405 ALLOCATE(NEXT_BLR_L(NB_BLR-CURRENT_BLR-1),stat=allocok)
406 IF (allocok > 0) THEN
408 IERROR = NB_BLR-CURRENT_BLR-1
411.GT.
IF (NB_BLRCURRENT_BLR+1) THEN
412 CALL CMUMPS_BLR_SAVE_PANEL_LORU (
415 & CURRENT_BLR+1, NEXT_BLR_U)
416 CALL CMUMPS_BLR_SAVE_PANEL_LORU (
419 & CURRENT_BLR+1, NEXT_BLR_L)
423 ALLOCATE(BLR_U(NB_BLR-CURRENT_BLR),stat=allocok)
424 IF (allocok > 0) THEN
426 IERROR = NB_BLR-CURRENT_BLR
429 ALLOCATE(BLR_L(NB_BLR-CURRENT_BLR),stat=allocok)
430 IF (allocok > 0) THEN
432 IERROR = NB_BLR-CURRENT_BLR
437 DO WHILE (IEND_BLOCK < IEND_BLR )
438 IBEG_BLOCK = IW(IOLDPS+1+KEEP(IXSZ)) + 1
439.EQ.
IF (KEEP(405)0) THEN
440 KEEP(425)=max(KEEP(425),IEND_BLOCK-IBEG_BLOCK)
443 KEEP(425)=max(KEEP(425),IEND_BLOCK-IBEG_BLOCK)
446 IEND_BLOCK = min(IEND_BLOCK + NBKJIB_ORIG, IEND_BLR)
448 CALL CMUMPS_FAC_I(NFRONT,NASS,NFRONT,
449 & IBEG_BLOCK,IEND_BLOCK,N,INODE,
450 & IW,LIW,A,LA,INOPV,NOFFW,NBTINYW,
451 & DET_EXPW, DET_MANTW, DET_SIGNW,
452 & IFLAG,IOLDPS,POSELT,UU,SEUIL_LOC,KEEP,KEEP8,
453 & DKEEP(1),PIVNUL_LIST(1),LPN_LIST,
454 & PP_FIRST2SWAP_L, MonBloc%LastPanelWritten_L,
455 & PP_LastPIVRPTRFilled_L,
456 & PP_FIRST2SWAP_U, MonBloc%LastPanelWritten_U,
457 & PP_LastPIVRPTRFilled_U,
458 & PIVOT_OPTION, LR_ACTIVATED, IEND_BLR,
459 & Inextpiv, OOC_EFFECTIVE_ON_FRONT,
462.LT.
IF (IFLAG0) GOTO 500
468.LE.
ELSE IF ( INOPV0 ) THEN
470.GE.
IF (PIVOT_OPTION3) THEN
472.EQ.
ELSEIF (PIVOT_OPTION2) THEN
477 CALL CMUMPS_FAC_MQ(IBEG_BLOCK, IEND_BLOCK,
478 & NFRONT, NASS, IW(IOLDPS+1+XSIZE),
479 & LAST_COL, A, LA, POSELT, IFINB,
482 IW(IOLDPS+1+XSIZE) = IW(IOLDPS+1+XSIZE) + 1
487 IF ( OOC_EFF_AND_WRITE_BYPANEL ) THEN
488 MonBloc%LastPiv= IW(IOLDPS+1+XSIZE)
489 STRAT = STRAT_TRY_WRITE
491 CALL CMUMPS_OOC_IO_LU_PANEL
493 & A(POSELT), LAFAC, MonBloc,
494 & LNextPiv2beWritten, UNextPiv2beWritten,
495 & IW(IOLDPS), LIWFAC,
496 & MYID, KEEP8(31), IFLAG_OOC,LAST_CALL )
497 IF (IFLAG_OOC < 0 ) THEN
502 NPIV = IW(IOLDPS+1+XSIZE)
503.GT.
IF ( IEND_BLR IEND_BLOCK ) THEN
504.GE.
IF (PIVOT_OPTION3) THEN
506.EQ.
ELSEIF (PIVOT_OPTION2) THEN
511 CALL CMUMPS_FAC_SQ(IBEG_BLOCK, IEND_BLOCK,
512 & NPIV, NFRONT, IEND_BLR, LAST_COL,
515 & .TRUE., .FALSE., .TRUE.,
521 NPIV = IW(IOLDPS+1+XSIZE)
522.NOT.
IF ( LR_ACTIVATED
523.OR..NOT.
& ( COMPRESS_PANEL)
525.EQ.
IF (PIVOT_OPTION4) THEN
530.GE.
IF (PIVOT_OPTION3) THEN
535.LT.
IF (IEND_BLRLAST_ROW) THEN
536 CALL CMUMPS_FAC_SQ(IBEG_BLR, IEND_BLR,
537 & NPIV, NFRONT, LAST_ROW, LAST_COL,
538.LT.
& A, LA, POSELT, IEND_BLR, .TRUE., (PIVOT_OPTION2),
543 NELIM = IEND_BLR - NPIV
544.EQ.
IF (NELIM IEND_BLR - IBEG_BLR + 1) THEN
551 DO J=1,NB_BLR-CURRENT_BLR
555 BLR_U(J)%ISLR=.FALSE.
559 CALL CMUMPS_BLR_SAVE_PANEL_LORU (
562 & CURRENT_BLR, BLR_U)
563 DO J=1,NB_BLR-CURRENT_BLR
567 BLR_L(J)%ISLR=.FALSE.
571 CALL CMUMPS_BLR_SAVE_PANEL_LORU (
574 & CURRENT_BLR, BLR_L)
577.GE..AND..LT.
IF (KEEP(480)2 IEND_BLRNASS) THEN
578.EQ.
IF (LRTRSM_OPTION3) THEN
581 FIRST_BLOCK = NPARTSASS-CURRENT_BLR
586 CALL CMUMPS_BLR_UPD_PANEL_LEFT(A, LA, POSELT,
587 & NFRONT, IW(IOLDPS+XXF), 0,
588 & BEGS_BLR, BEGS_BLR, CURRENT_BLR, ACC_LUA,
589 & NB_BLR, NPARTSASS, NELIM,
591 & .FALSE., IFLAG, IERROR, 0,
592 & KEEP(481), DKEEP(11), KEEP(466), KEEP(477),
593 & KEEP(480), KEEP(479), KEEP(478), KEEP(476),
594 & KEEP(483), MAXI_CLUSTER, MAXI_RANK,
595 & KEEP(474), 0, BLR_U,
597 & FIRST_BLOCK=FIRST_BLOCK)
598.LT.
IF (IFLAG0) GOTO 900
599 CALL CMUMPS_BLR_UPD_PANEL_LEFT(A, LA, POSELT,
600 & NFRONT, IW(IOLDPS+XXF), 1,
601 & BEGS_BLR, BEGS_BLR, CURRENT_BLR, ACC_LUA,
602 & NB_BLR, NPARTSASS, NELIM,
604 & .FALSE., IFLAG, IERROR, 0,
605 & KEEP(481), DKEEP(11), KEEP(466), KEEP(477),
606 & KEEP(480), KEEP(479), KEEP(478), KEEP(476),
607 & KEEP(483), MAXI_CLUSTER, MAXI_RANK,
608 & KEEP(474), 0, BLR_U,
610 & FIRST_BLOCK=FIRST_BLOCK)
615.LT.
IF (IFLAG0) GOTO 500
618.EQ.
IF (KEEP(486)3) THEN
619.EQ.
IF (KEEP(480)0) THEN
620 DEALLOCATE(BLR_U,BLR_L)
627.GE.
IF (PIVOT_OPTION3) THEN
629.EQ.
ELSEIF (PIVOT_OPTION2) THEN
634.EQ.
IF (LRTRSM_OPTION3) THEN
636.EQ.
ELSEIF (LRTRSM_OPTION2) THEN
641.EQ.
CALL_LTRSM = (LRTRSM_OPTION0)
642.GT.
CALL_UTRSM = (LAST_COL-FIRST_COL0)
643.LT..AND.
IF ((IEND_BLRNFRONT)
644.OR.
& (CALL_LTRSMCALL_UTRSM)) THEN
645 CALL CMUMPS_FAC_SQ(IBEG_BLR, IEND_BLR,
646 & NPIV, NFRONT, NFRONT,
649 & FIRST_COL, CALL_LTRSM,
650 & CALL_UTRSM, .FALSE.,
657!$OMP PARALLEL PRIVATE(UPOS,LPOS) FIRSTPRIVATE(FIRST_BLOCK,LAST_BLOCK)
659 CALL CMUMPS_COMPRESS_PANEL(A, LA, POSELT, IFLAG,
662 & BEGS_BLR, NB_BLR, DKEEP(8), KEEP(466), K473_LOC,
663 & BLR_U, CURRENT_BLR,
664 & 'h
', WORK, TAU, JPVT, LWORK, RWORK,
665 & BLOCK, MAXI_CLUSTER, NELIM,
667 & 1, KEEP(483), KEEP8,
673.LT.
IF (IFLAG0) GOTO 400
674 CALL CMUMPS_COMPRESS_PANEL(A, LA, POSELT, IFLAG, IERROR,
676 & BEGS_BLR, NB_BLR, DKEEP(8), KEEP(466), K473_LOC, BLR_L,
678 & 'v
', WORK, TAU, JPVT, LWORK, RWORK,
679 & BLOCK, MAXI_CLUSTER, NELIM,
681 & 1, KEEP(483), KEEP8,
694.LT.
IF (KEEP(480)5) THEN
695 CALL CMUMPS_BLR_SAVE_PANEL_LORU(
698 & CURRENT_BLR, BLR_U)
699 CALL CMUMPS_BLR_SAVE_PANEL_LORU (
702 & CURRENT_BLR, BLR_L)
709.LT.
IF (IFLAG0) GOTO 400
710.GT.
IF (LRTRSM_OPTION0) THEN
711 CALL CMUMPS_BLR_PANEL_LRTRSM(A, LA, POSELT, NFRONT,
713 & NB_BLR, BLR_L, CURRENT_BLR, CURRENT_BLR+1,
714 & NB_BLR, 1, 0, 0, .FALSE.)
715.LT..AND..GE.
IF (PIVOT_OPTION3LRTRSM_OPTION2) THEN
716.LE..AND..EQ.
IF (PIVOT_OPTION1LRTRSM_OPTION3) THEN
717 FIRST_BLOCK = CURRENT_BLR+1
719 FIRST_BLOCK = NPARTSASS+1
721 CALL CMUMPS_BLR_PANEL_LRTRSM(A, LA, POSELT, NFRONT,
722 & IBEG_BLR, NB_BLR, BLR_U,
723 & CURRENT_BLR, FIRST_BLOCK, NB_BLR,
728 CALL CMUMPS_BLR_UPD_NELIM_VAR_U(
729 & A, LA, POSELT, IFLAG, IERROR, NFRONT,
730 & BEGS_BLR, CURRENT_BLR, BLR_U, NB_BLR,
731 & FIRST_BLOCK, IBEG_BLR, NPIV, NELIM)
737.LT.
IF (IFLAG0) GOTO 400
738.GE.
IF (KEEP(480)2) THEN
739 UPOS = POSELT+int(BEGS_BLR(CURRENT_BLR)-1,8)*int(NFRONT,8)
740 & +int(BEGS_BLR(CURRENT_BLR+1)-NELIM-1,8)
741 LPOS = POSELT+int(BEGS_BLR(CURRENT_BLR+1)-1,8)*int(NFRONT,8)
742 & +int(BEGS_BLR(CURRENT_BLR+1)-NELIM-1,8)
743 CALL CMUMPS_BLR_UPD_NELIM_VAR_L(A, LA, UPOS, A, LA,
744 & LPOS, IFLAG, IERROR, NFRONT, NFRONT,
745 & BEGS_BLR, CURRENT_BLR, BLR_L, NB_BLR,
746 & CURRENT_BLR+1, NELIM, 'n
')
747.LT.
IF (IFLAG0) GOTO 444
748.LT.
IF (IEND_BLRNASS) THEN
749.EQ.
IF (LRTRSM_OPTION3) THEN
752 FIRST_BLOCK = NPARTSASS-CURRENT_BLR
754 CALL CMUMPS_BLR_UPD_PANEL_LEFT(A, LA, POSELT,
755 & NFRONT, IW(IOLDPS+XXF), 0,
756 & BEGS_BLR, BEGS_BLR, CURRENT_BLR, ACC_LUA,
757 & NB_BLR, NPARTSASS, NELIM,
759 & .FALSE., IFLAG, IERROR, 0,
760 & KEEP(481), DKEEP(11), KEEP(466), KEEP(477),
761 & KEEP(480), KEEP(479), KEEP(478), KEEP(476),
762 & KEEP(483), MAXI_CLUSTER, MAXI_RANK,
763 & KEEP(474), 0, BLR_U,
765 & FIRST_BLOCK=FIRST_BLOCK)
766.LT.
IF (IFLAG0) GOTO 442
767 CALL CMUMPS_BLR_UPD_PANEL_LEFT(A, LA, POSELT,
768 & NFRONT, IW(IOLDPS+XXF), 1,
769 & BEGS_BLR, BEGS_BLR, CURRENT_BLR, ACC_LUA,
770 & NB_BLR, NPARTSASS, NELIM,
772 & .FALSE., IFLAG, IERROR, 0,
773 & KEEP(481), DKEEP(11), KEEP(466), KEEP(477),
774 & KEEP(480), KEEP(479), KEEP(478), KEEP(476),
775 & KEEP(483), MAXI_CLUSTER, MAXI_RANK,
776 & KEEP(474), 0, BLR_U,
778 & FIRST_BLOCK=FIRST_BLOCK)
783 CALL CMUMPS_BLR_UPDATE_TRAILING(A, LA, POSELT,
784 & IFLAG, IERROR, NFRONT,
785 & BEGS_BLR, BEGS_BLR, CURRENT_BLR, BLR_L, NB_BLR,
789 & KEEP(481), DKEEP(11), KEEP(466), KEEP(477)
795.LT.
IF (IFLAG0) GOTO 400
796.NE.
IF (KEEP(486)2) THEN
799 LAST_BLOCK = NPARTSASS
801 LAST_BLOCK = CURRENT_BLR
803.GT.
IF (LRTRSM_OPTION0) THEN
804 FIRST_BLOCK = CURRENT_BLR+1
805 CALL CMUMPS_DECOMPRESS_PANEL(A, LA, POSELT, NFRONT,
807 & BEGS_BLR(CURRENT_BLR),
808 & BEGS_BLR(CURRENT_BLR+1),
809 & NB_BLR, BLR_L, CURRENT_BLR, 'v
', 1,
810 & BEG_I_IN=FIRST_BLOCK, END_I_IN=LAST_BLOCK)
814.GE.
IF (LRTRSM_OPTION2) THEN
815.EQ.
IF (LRTRSM_OPTION2) THEN
816 FIRST_BLOCK = NPARTSASS+1
818 FIRST_BLOCK = CURRENT_BLR+1
820 CALL CMUMPS_DECOMPRESS_PANEL(A, LA, POSELT, NFRONT,
822 & BEGS_BLR(CURRENT_BLR),
823 & BEGS_BLR(CURRENT_BLR+1),
824 & NB_BLR, BLR_U, CURRENT_BLR, 'h
', 1,
825 & BEG_I_IN=FIRST_BLOCK, END_I_IN=LAST_BLOCK)
831.LT.
IF (IFLAG0) GOTO 500
832.EQ.
IF (KEEP(486)3) THEN
833.EQ.
IF (KEEP(480)0) THEN
834 CALL DEALLOC_BLR_PANEL(BLR_U, NB_BLR-CURRENT_BLR, KEEP8,
836 CALL DEALLOC_BLR_PANEL(BLR_L, NB_BLR-CURRENT_BLR, KEEP8,
838 DEALLOCATE(BLR_U,BLR_L)
844 IF ( OOC_EFF_AND_WRITE_BYPANEL ) THEN
845.LT.
IF (PIVOT_OPTION4) THEN
848 TYPEF_LOC = TYPEF_BOTH_LU
850 MonBloc%LastPiv= IW(IOLDPS+1+XSIZE)
851 STRAT = STRAT_TRY_WRITE
853 CALL CMUMPS_OOC_IO_LU_PANEL
854 & ( STRAT, TYPEF_LOC,
855 & A(POSELT), LAFAC, MonBloc,
856 & LNextPiv2beWritten, UNextPiv2beWritten,
857 & IW(IOLDPS), LIWFAC,
858 & MYID, KEEP8(31), IFLAG_OOC,LAST_CALL )
859 IF (IFLAG_OOC < 0 ) THEN
866 IF (LR_ACTIVATED) THEN
867 IBEG_BLR = IW(IOLDPS+1+KEEP(IXSZ)) + 1
868 BEGS_BLR( CURRENT_BLR + 1 ) = IBEG_BLR
872 CALL CMUMPS_BLR_RETRIEVE_BEGSBLR_STA(IW(IOLDPS+XXF),
875 allocate(BEGS_BLR_TMP(NB_BLR+1),stat=allocok)
876 IF (allocok > 0) THEN
882 BEGS_BLR_TMP(IP) = BEGS_BLR_STATIC(IP)
889!$OMP& PRIVATE(IP, LorU, DIR, NELIM_LOC, BLR_PANEL)
895!$OMP DO PRIVATE(DIAG, DIAGSIZ_STA, DIAGSIZ_DYN, DPOS, POSELT_DIAG, MEM,
897!$OMP& REDUCTION(+:MEM_TOT)
900.LT.
IF (IFLAG0) CYCLE
901 DIAGSIZ_DYN = BEGS_BLR(IP+1)-BEGS_BLR(IP)
902 DIAGSIZ_STA = BEGS_BLR_STATIC(IP+1)-BEGS_BLR(IP)
903 MEM = DIAGSIZ_DYN*(2*DIAGSIZ_STA-DIAGSIZ_DYN)
904 MEM_TOT = MEM_TOT + MEM
905 ALLOCATE(DIAG(MEM), stat=allocok)
906 IF (allocok > 0) THEN
912 POSELT_DIAG = POSELT + int(BEGS_BLR(IP)-1,8)*int(NFRONT,8)
913 & + int(BEGS_BLR(IP)-1,8)
915.LE.
IF (IDIAGSIZ_DYN) THEN
916 DIAG(DPOS:DPOS+DIAGSIZ_STA-1) =
917 & A(POSELT_DIAG:POSELT_DIAG+int(DIAGSIZ_STA-1,8))
918 DPOS = DPOS + DIAGSIZ_STA
920 DIAG(DPOS:DPOS+DIAGSIZ_DYN-1) =
921 & A(POSELT_DIAG:POSELT_DIAG+int(DIAGSIZ_DYN-1,8))
922 DPOS = DPOS + DIAGSIZ_DYN
924 POSELT_DIAG = POSELT_DIAG + int(NFRONT,8)
926 CALL CMUMPS_BLR_SAVE_DIAG_BLOCK(
934 CALL MUMPS_DM_FAC_UPD_DYN_MEMCNTS(int(MEM_TOT,8),
935.NE.
& (KEEP(405)0), KEEP8, IFLAG, IERROR, .TRUE., .TRUE.)
939.LT.
IF (IFLAG0) GOTO 447
942 NELIM_LOC = BEGS_BLR_TMP(IP+1)-BEGS_BLR(IP+1)
944 CALL CMUMPS_BLR_RETRIEVE_PANEL_LORU(
945 & IW(IOLDPS+XXF), LorU, IP, BLR_PANEL)
949 CALL DEALLOC_BLR_PANEL(BLR_PANEL, NPARTSASS-IP, KEEP8,
960 & ierror, nfront, begs_blr_tmp,
961 & nb_blr, dkeep(8), keep(466), k473_loc,
963 & dir, work, tau, jpvt, lwork, rwork,
964 & block, maxi_cluster, nelim_loc,
966 & 1, keep(483), keep8,
967 & end_i_in=npartsass, frswap=.true.
972 IF (iflag.LT.0)
GOTO 445
978 begs_blr_tmp(ip+1) = begs_blr(ip+1)
990 IF (iflag .LT. 0)
GOTO 450
991 IF (keep(480) .GE. 2)
THEN
1001 & begs_blr_static, begs_blr_static,
1002 & npartscb, npartscb, npartsass, nass,
1004 & 1, .false., iflag, ierror,
1005 & keep(481), dkeep(11), keep(466), keep(477),
1006 & acc_lua, keep(480),keep(479),keep(478),keep(47
1007 & keep(484), maxi_cluster, maxi_rank,
1008 & keep(474), 0, blr_u,
1015 IF (iflag.LT.0)
GOTO 450
1028 IF (compress_cb)
THEN
1029 iend_blr = begs_blr(current_blr+2)
1030 IF ( iend_blr - ibeg_blr + 1 .GT. maxi_cluster )
THEN
1031 maxi_cluster = iend_blr - ibeg_blr + 1
1032 lwork = maxi_cluster*maxi_cluster
1033 DEALLOCATE(block, work, rwork, tau, jpvt)
1034 ALLOCATE(block(maxi_cluster, omp_num*maxi_cluster),
1035 & rwork(2*maxi_cluster*omp_num),
1036 & tau(maxi_cluster*omp_num),
1037 & jpvt(maxi_cluster*omp_num),
1038 & work(lwork*omp_num),stat=allocok)
1039 IF (allocok > 0)
THEN
1041 ierror = omp_num*(lwork + maxi_cluster*(maxi_cluster+4))
1049 IF (iflag.LT.0)
GOTO 450
1050 IF (compress_cb)
THEN
1052 & begs_blr, begs_blr, npartscb, npartscb, npartsass,
1053 & nfront-nass, nfront-nass, inode,
1054 & iw(ioldps+xxf), 0, 1, iflag, ierror,
1055 & dkeep(12), keep(466), keep(484), keep(489), cb_lrb,
1056 & work, tau, jpvt, lwork, rwork, block,
1057 & maxi_cluster, keep8,
1058 & -9999, -9999, -9999, keep(1),
1074 deallocate(begs_blr_tmp)
1076 IF (iflag.LT.0)
GOTO 500
1081 & iw(ioldps+xxf), loru, ip, blr_panel)
1088 IF ( (pivot_option.LT.4) .AND. (.NOT.lr_activated) )
THEN
1090 & nfront, nass, (pivot_option.LT.3), a, la, lafac, poselt,
1091 & iw, liw, ioldps, monbloc, myid, noffw,
1092 & det_expw, det_mantw, det_signw,
1094 & pp_first2swap_l, pp_first2swap_u,
1095 & lnextpiv2bewritten, unextpiv2bewritten,
1096 & pp_lastpivrptrfilled_l, pp_lastpivrptrfilled_u,
1098 & xsize, seuil, uu, dkeep, keep8, keep, iflag,
1099 & ooc_effective_on_front, nvschur )
1101 IF (keep(486).NE.0)
THEN
1102 IF (.NOT.lr_activated)
THEN
1106 IF ( ooc_effective_on_front )
THEN
1107 strat = strat_write_max
1108 monbloc%Last = .true.
1109 monbloc%LastPiv = iw(ioldps+1+xsize)
1113 & a(poselt), lafac, monbloc,
1114 & lnextpiv2bewritten, unextpiv2bewritten,
1115 & iw(ioldps), liwfac,
1116 & myid, keep8(31), iflag_ooc, last_call )
1117 IF (iflag_ooc < 0 )
THEN
1122 & ioldps, iw, liw, monbloc , nfront, keep)
1128 IF (lr_activated)
THEN
1129 IF (
allocated(work))
deallocate(work)
1130 IF (
allocated(rwork))
DEALLOCATE(rwork)
1131 IF (
allocated(tau))
deallocate(tau)
1132 IF (
allocated(jpvt))
deallocate(jpvt)
1133 IF (
allocated(block))
deallocate(block)
1134 IF (
associated(acc_lua))
THEN
1135 IF (keep(480).GE.3)
THEN
1137 CALL dealloc_lrb(acc_lua(my_num), keep8, keep(34))
1143 IF (
associated(begs_blr))
THEN
1144 DEALLOCATE(begs_blr)
1148 IF (lr_activated.AND.(keep(480).NE.0))
THEN
1158 IF (lr_activated)
THEN
1163 & .AND..NOT.compress_cb)
THEN
1165 & keep(34), mtk405=keep
1168 npvw = npvw + iw(ioldps+1+xsize)
subroutine cmumps_blr_upd_cb_left(a, la, poselt, nfront, begs_blr, begs_blr_u, nb_rows, nb_incb, nb_inasm, nass, iwhandler, niv, lbandslave, iflag, ierror, midblk_compress, toleps, tol_opt, kpercent_rmb, acc_lua, k480, k479, k478, kpercent_lua, kpercent, maxi_cluster, maxi_rank, k474, fsorcb, blr_u_col, compress_cb, cb_lrb, keep8)
subroutine cmumps_compress_cb(a, la, poselt, lda, begs_blr, begs_blr_u, nb_rows, nb_cols, nb_inasm, nrows, ncols, inode, iwhandler, sym, niv, iflag, ierror, toleps, tol_opt, kpercent, k489, cb_lrb, work, tau, jpvt, lwork, rwork, block, maxi_cluster, keep8, nfs4father, npiv, nvschur_k253, keep, m_array, nelim, nbrowsinf)