26#if ! defined(NO_FDM_DESCBAND)
28#endif
29#if ! defined(NO_FDM_MAPROW)
31#endif
32
33
35 IMPLICIT NONE
36
37
38
39
40
41
42
43
44
45 INTERFACE
48 TYPE (CMUMPS_STRUC), TARGET :: id
49 REAL, INTENT(OUT) :: ANORMINF
50 LOGICAL, INTENT(IN) :: LSCAL
51 INTEGER, INTENT(IN) :: EFF_SIZE_SCHUR
54 & id_BLRARRAY_ENCODING, KEEP8, K34)
55# if defined(MUMPS_F2003)
56 CHARACTER, DIMENSION(:), POINTER, intent(inout) ::
57 & id_blrarray_encoding
58 CHARACTER, DIMENSION(:), POINTER, intent(inout) ::
59 & id_fdm_f_encoding
60# else
61 CHARACTER, DIMENSION(:), POINTER :: id_BLRARRAY_ENCODING
62 CHARACTER, DIMENSION(:), POINTER :: id_FDM_F_ENCODING
63# endif
64 INTEGER(8), intent(inout) :: KEEP8(150)
65 INTEGER, intent(in) :: K34
67 END INTERFACE
68
69
70
71
72 TYPE(CMUMPS_STRUC), TARGET :: id
73
74
75
76
77 include 'mpif.h'
78 include 'mumps_tags.h'
79 INTEGER :: STATUS(MPI_STATUS_SIZE)
80 INTEGER :: IERR
81 INTEGER, PARAMETER :: MASTER = 0
82
83
84
85
86 include 'mumps_headers.h'
87 INTEGER(8) :: NSEND8, NSEND_TOT8
88 INTEGER(8) :: NLOCAL8, NLOCAL_TOT8
89 INTEGER(4) :: I4
90 INTEGER :: LDPTRAR, NELT_arg, NBRECORDS
91 INTEGER :: ITMP, JTMP
92 INTEGER :: KEEP464COPY, KEEP465COPY
93 REAL :: RATIOK465
94 INTEGER(8) :: KEEP826_SAVE
95 INTEGER(8) :: K67, K68, K70, K74, K75
96 INTEGER(8) ITMP8
97 INTEGER MUMPS_PROCNODE
99 INTEGER MP, LP, MPG, allocok
100 LOGICAL PROK, PROKG, LSCAL, LPOK, COMPUTE_ANORMINF
101
102 INTEGER :: CMUMPS_LBUFR, CMUMPS_LBUFR_BYTES
103 INTEGER(8) :: CMUMPS_LBUFR_BYTES8
104 INTEGER, ALLOCATABLE, DIMENSION(:) :: BUFR
105
106 INTEGER :: CMUMPS_LBUF, CMUMPS_LBUF_INT
107 INTEGER(8) :: CMUMPS_LBUF8
108
109 INTEGER PTRIST, PTRWB, MAXELT_SIZE,
110 & itloc, ipool, k28, lpool
111 INTEGER IRANK, ID_ROOT
112 INTEGER KKKK
113 INTEGER(8) :: NZ_locMAX8
114 INTEGER(8) MEMORY_MD_ARG
115 INTEGER(8) MAXS_BASE8, MAXS_BASE_RELAXED8
116 REAL CNTL4, AVG_FLOPS
117 INTEGER MIN_PERLU, MAXIS_ESTIM
118 INTEGER SUM_INFO22_THIS_NODE, MAX_SUM_INFO22_THIS_NODE
119
120 TYPE (S_IS_POINTERS_T) :: S_IS_POINTERS
121 INTEGER MAXIS
122 INTEGER(8) :: MAXS
123
124 INTEGER(8) :: MAXS_ARG
125 COMPLEX, TARGET :: S_DUMMY_ARG(1)
126 COMPLEX, POINTER, DIMENSION(:) :: S_PTR_ARG
127 INTEGER NB_THREADS, NOMP
128 DOUBLE PRECISION TIMEAVG, TIMEMAX,
129 & flopavg, flopmax
130 REAL TMPTIME, TMPFLOP
131 INTEGER NPIV_CRITICAL_PATH, EFF_SIZE_SCHUR
132 DOUBLE PRECISION TIME, TIMEET
133 REAL ZERO, ONE, MONE
134 parameter( zero = 0.0e0, one = 1.0e0, mone = -1.0e0)
135 COMPLEX CZERO
136 parameter( czero = (0.0e0, 0.0e0) )
137 INTEGER PERLU, TOTAL_MBYTES, K231, K232, , BLR_STRAT
138 INTEGER, PARAMETER :: IDUMMY = -9999
139 LOGICAL, PARAMETER :: BDUMMY =.false.
140 INTEGER, PARAMETER :: PANEL_TABSIZE = 20
141 INTEGER COLOUR, COMM_FOR_SCALING ! For Simultaneous scaling
142 INTEGER LIWK, LWK_REAL
143 INTEGER(8) :: LWK
144
145
146 LOGICAL I_AM_SLAVE, PERLU_ON, WK_USER_PROVIDED, EARLYT3ROOTINS
147 LOGICAL PRINT_MAXAVG, PRINT_NODEINFO
148 REAL :: ANORMINF, SEUIL, SEUIL_LDLT_NIV2, Thresh_Seuil
149 REAL :: CNTL1, CNTL3, CNTL5, CNTL6, EPS
150 INTEGER N, LPN_LIST,POSBUF
151 INTEGER, DIMENSION (:), ALLOCATABLE :: ITMP2
152 INTEGER I,K
153 INTEGER(8) :: ITEMP8
154 INTEGER :: PARPIV_T1
155 INTEGER FRONTWISE
156
157 DOUBLE PRECISION :: TMP_MRY_LU_FR
158 DOUBLE PRECISION :: TMP_MRY_LU_LRGAIN
159 DOUBLE PRECISION :: TMP_MRY_CB_FR
160 DOUBLE PRECISION :: TMP_MRY_CB_LRGAIN
161 DOUBLE PRECISION :: TMP_FLOP_LRGAIN
162 DOUBLE PRECISION ::
163 DOUBLE PRECISION :: TMP_FLOP_PANEL
164 DOUBLE PRECISION :: TMP_FLOP_FRFRONTS
165 DOUBLE PRECISION :: TMP_FLOP_TRSM_FR
166 DOUBLE PRECISION :: TMP_FLOP_TRSM_LR
167 DOUBLE PRECISION :: TMP_FLOP_UPDATE_FR
168 DOUBLE PRECISION :: TMP_FLOP_UPDATE_LR
169 DOUBLE PRECISION :: TMP_FLOP_UPDATE_LRLR3
170 DOUBLE PRECISION :: TMP_FLOP_COMPRESS
171 DOUBLE PRECISION :: TMP_FLOP_DECOMPRESS
172 DOUBLE PRECISION :: TMP_FLOP_MIDBLK_COMPRESS
173 DOUBLE PRECISION :: TMP_FLOP_FRSWAP_COMPRESS
174 DOUBLE PRECISION :: TMP_FLOP_ACCUM_COMPRESS
175 DOUBLE PRECISION :: TMP_FLOP_CB_COMPRESS
176 DOUBLE PRECISION :: TMP_FLOP_CB_DECOMPRESS
177 DOUBLE PRECISION :: TMP_FLOP_FACTO_FR
178 INTEGER :: TMP_CNT_NODES
179 DOUBLE PRECISION :: TMP_TIME_UPDATE
180 DOUBLE PRECISION :: TMP_TIME_UPDATE_LRLR1
181 DOUBLE PRECISION :: TMP_TIME_UPDATE_LRLR2
182 DOUBLE PRECISION :: TMP_TIME_UPDATE_LRLR3
183 DOUBLE PRECISION :: TMP_TIME_UPDATE_FRLR
184 DOUBLE PRECISION :: TMP_TIME_UPDATE_FRFR
185 DOUBLE PRECISION :: TMP_TIME_COMPRESS
186 DOUBLE PRECISION :: TMP_TIME_MIDBLK_COMPRESS
187 DOUBLE PRECISION :: TMP_TIME_FRSWAP_COMPRESS
188 DOUBLE PRECISION :: TMP_TIME_CB_COMPRESS
189 DOUBLE PRECISION :: TMP_TIME_PANEL
190 DOUBLE PRECISION :: TMP_TIME_FAC_I
191 DOUBLE PRECISION :: TMP_TIME_FAC_MQ
192 DOUBLE PRECISION :: TMP_TIME_FAC_SQ
193 DOUBLE PRECISION :: TMP_TIME_LRTRSM
194 DOUBLE PRECISION :: TMP_TIME_FRTRSM
195 DOUBLE PRECISION :: TMP_TIME_FRFRONTS
196 DOUBLE PRECISION :: TMP_TIME_LR_MODULE
197 DOUBLE PRECISION :: TMP_TIME_DIAGCOPY
198 DOUBLE PRECISION :: TMP_TIME_DECOMP
199 DOUBLE PRECISION :: TMP_TIME_DECOMP_UCFS
200 DOUBLE PRECISION :: TMP_TIME_DECOMP_ASM1
201 DOUBLE PRECISION :: TMP_TIME_DECOMP_LOCASM2
202 DOUBLE PRECISION :: TMP_TIME_DECOMP_MAPLIG1
203 DOUBLE PRECISION :: TMP_TIME_DECOMP_ASMS2S
204 DOUBLE PRECISION :: TMP_TIME_DECOMP_ASMS2M
205
206
207
208 INTEGER, DIMENSION(:), ALLOCATABLE :: IWK
209 COMPLEX, DIMENSION(:), ALLOCATABLE :: WK
210 REAL, DIMENSION(:), ALLOCATABLE :: WK_REAL
211 INTEGER(8), DIMENSION(:), ALLOCATABLE :: IWK8
212 INTEGER, DIMENSION(:), ALLOCATABLE :: BURP
213 INTEGER, DIMENSION(:), ALLOCATABLE :: BUCP
214 INTEGER, DIMENSION(:), ALLOCATABLE :: BURS
215 INTEGER, DIMENSION(:), ALLOCATABLE :: BUCS
216 INTEGER BUREGISTRE(12)
217 INTEGER BUINTSZ, BURESZ, BUJOB
218 INTEGER BUMAXMN, M, SCMYID, SCNPROCS
219 REAL SCONEERR, SCINFERR
220
221
222
223
224 INTEGER, POINTER :: JOB
225
226 REAL,DIMENSION(:),POINTER::RINFO, RINFOG
227 REAL,DIMENSION(:),POINTER:: CNTL
228 INTEGER,DIMENSION(:),POINTER:: INFOG, KEEP
229 INTEGER, DIMENSION(:), POINTER :: MYIRN_loc, MYJCN_loc
230 COMPLEX, DIMENSION(:), POINTER :: MYA_loc
231 INTEGER, TARGET :: DUMMYIRN_loc(1), DUMMYJCN_loc(1)
232 COMPLEX, TARGET :: DUMMYA_loc(1)
233 INTEGER,DIMENSION(:),POINTER::ICNTL
235 INTEGER MUMPS_GET_POOL_LENGTH
236 INTEGER(8) :: TOTAL_BYTES
237 INTEGER(8) :: I8TMP, LWK_USER_SUM8
238
239
240
241 INTEGER numroc
243 INTEGER:: NWORKING
244 LOGICAL:: MEM_EFF_ALLOCATED
245 INTEGER :: TOTAL_MBYTES_UNDER_L0
246 INTEGER(8):: TOTAL_BYTES_UNDER_L0
247
248 COMPLEX, DIMENSION(:), POINTER :: RHS_MUMPS
249 LOGICAL :: RHS_MUMPS_ALLOCATED
250 INTEGER :: NB_ACTIVE_FRONTS_ESTIM
251 INTEGER :: NB_FRONTS_F_ESTIM
252
253
261 IF (
id%KEEP8(29) .NE. 0)
THEN
262 myirn_loc=>
id%IRN_loc
263 myjcn_loc=>
id%JCN_loc
265 ELSE
266 myirn_loc=>dummyirn_loc
267 myjcn_loc=>dummyjcn_loc
268 mya_loc=>dummya_loc
269 ENDIF
271 eps = epsilon( zero )
272
279
282
283 id%DKEEP(19)=huge(0.0e0)
284 id%DKEEP(20)=huge(0.0e0)
286
288
290
291 print_maxavg = .NOT.(
id%NSLAVES.EQ.1 .AND. keep(46).EQ.1)
292
293
294 print_nodeinfo = print_maxavg .AND.
id%NPROCS .NE.
id%KEEP(412)
295
296
297
298
299 IF (
id%KEEP8(24).EQ.0_8)
THEN
300
301 IF (
associated(
id%S))
THEN
305 ENDIF
306 ENDIF
307 IF (
associated(
id%IS))
THEN
310 ENDIF
311
313 &
id%BLRARRAY_ENCODING,
id%KEEP8(1),
id%KEEP(34))
314 IF (
associated(
id%root%RG2L_ROW))
THEN
315 DEALLOCATE(
id%root%RG2L_ROW)
316 NULLIFY(
id%root%RG2L_ROW)
317 ENDIF
318 IF (
associated(
id%root%RG2L_COL))
THEN
319 DEALLOCATE(
id%root%RG2L_COL)
320 NULLIFY(
id%root%RG2L_COL)
321 ENDIF
322 IF (
associated(
id%PTLUST_S ))
THEN
323 DEALLOCATE(
id%PTLUST_S)
325 ENDIF
326 IF (
associated(
id%PTRFAC))
THEN
327 DEALLOCATE(
id%PTRFAC)
329 END IF
330 IF (
associated(
id%RHSCOMP))
THEN
331 DEALLOCATE(
id%RHSCOMP)
334 ENDIF
335 IF (
associated(
id%POSINRHSCOMP_ROW))
THEN
336 DEALLOCATE(
id%POSINRHSCOMP_ROW)
337 NULLIFY(
id%POSINRHSCOMP_ROW)
338 ENDIF
339 IF (
id%POSINRHSCOMP_COL_ALLOC)
THEN
340 DEALLOCATE(
id%POSINRHSCOMP_COL)
341 NULLIFY(
id%POSINRHSCOMP_COL)
342 id%POSINRHSCOMP_COL_ALLOC = .false.
343 ENDIF
344
345
346
347
348 NULLIFY(rhs_mumps)
349 rhs_mumps_allocated = .false.
350
351
352
353
354
355 IF (
id%KEEP8(24).GT.0_8)
THEN
356
357
359 ENDIF
360
361
362 wk_user_provided = (
id%LWK_USER.NE.0)
363 IF (wk_user_provided) THEN
364 IF (
id%LWK_USER.GT.0)
THEN
365 id%KEEP8(24) = int(
id%LWK_USER,8)
366 ELSE
367 id%KEEP8(24) = -int(
id%LWK_USER,8)* 1000000_8
368 ENDIF
369 ELSE
371 ENDIF
372
373 lwk_user_sum8 = 0_8
374 CALL mpi_reduce (
id%KEEP8(24), lwk_user_sum8, 1, mpi_integer8,
375 & mpi_sum, master,
id%COMM, ierr )
376
377
378
379
380
381
382
383 keep826_save =
id%KEEP8(26)
384
385
386
389
390
391
392 IF (
associated(
id%IPTR_WORKING))
THEN
393 DEALLOCATE(
id%IPTR_WORKING)
394 NULLIFY(
id%IPTR_WORKING)
395 END IF
396 IF (
associated(
id%WORKING))
THEN
397 DEALLOCATE(
id%WORKING)
399 END IF
400
401
402
403
404
405 lp = icntl( 1 )
406 mp = icntl( 2 )
407 mpg = icntl( 3 )
408 lpok = ((lp.GT.0).AND.(
id%ICNTL(4).GE.1))
409 prok = ((mp.GT.0).AND.(
id%ICNTL(4).GE.2))
410 prokg = ( mpg .GT. 0 .and.
id%MYID .eq. master )
411 prokg = (prokg.AND.(
id%ICNTL(4).GE.2))
412 IF ( prok ) WRITE( mp, 130 )
413 IF ( prokg ) WRITE( mpg, 130 )
414
415
416
417
418
419 i_am_slave = (
id%MYID .ne. master .OR.
420 & (
id%MYID .eq. master .AND.
421 & keep(46) .eq. 1 ) )
422
423
424
425 IF (
id%MYID .EQ. master .AND. keep(201) .NE. -1)
THEN
426
427
428
429
430
431
432
433 keep(201)=
id%ICNTL(22)
434 IF (keep(201) .NE. 0) THEN
435# if defined(OLD_OOC_NOPANEL)
436 keep(201)=2
437# else
438 keep(201)=1
439# endif
440 ENDIF
441 ENDIF
442
443
444
445
446 CALL mpi_bcast( keep(12), 1, mpi_integer,
447 & master,
id%COMM, ierr )
448 CALL mpi_bcast( keep(19), 1, mpi_integer,
449 & master,
id%COMM, ierr )
450 CALL mpi_bcast( keep(21), 1, mpi_integer,
451 & master,
id%COMM, ierr )
452 CALL mpi_bcast( keep(201), 1, mpi_integer,
453 & master,
id%COMM, ierr )
454 CALL mpi_bcast( keep(459), 1, mpi_integer,
455 & master,
id%COMM, ierr )
456 CALL mpi_bcast( keep(460), 1, mpi_integer,
457 & master,
id%COMM, ierr )
458 IF ( keep(459) .GE. panel_tabsize ) THEN
459 IF ( lpok ) THEN
460 WRITE(lp,'(A,I4,A,I3)') " ** WARNING ** KEEP(459)=",keep(459),
461 & " too large, resetting to",panel_tabsize-1
462 ENDIF
463 keep(459) = panel_tabsize - 1
464 ENDIF
465 perlu = keep(12)
466 IF (
id%MYID.EQ.master)
THEN
467
468
469
470
471
472
473
474
475
477
478
479
480
481 keep(17)=0
482 IF ( keep(50) .eq. 1 ) THEN
483 IF (cntl1 .ne. zero ) THEN
484 IF ( prokg ) THEN
485 WRITE(mpg,'(A)')
486 & '** Warning : SPD solver called, resetting CNTL(1) to 0.0E0'
487 END IF
488 END IF
489 cntl1 = zero
490 END IF
491
492
493 IF (cntl1.GT.one) cntl1=one
494 IF (cntl1.LT.zero) cntl1=zero
495 IF (keep(50).NE.0.AND.cntl1.GT.0.5e0) THEN
496 cntl1 = 0.5e0
497 ENDIF
498 parpiv_t1 =
id%KEEP(268)
499 IF (parpiv_t1.EQ.77) THEN
500 parpiv_t1 = 0
501#if defined(__ve__)
502 parpiv_t1 = -2
503#endif
504 ENDIF
505 IF (parpiv_t1.EQ.-3) THEN
506 parpiv_t1 = 0
507 ENDIF
508 IF ((parpiv_t1.LT.-3).OR.(parpiv_t1.GT.1)) THEN
509
510 parpiv_t1 =0
511 ENDIF
512
513 IF (cntl1.EQ.0.0.OR.(keep(50).eq.1)) parpiv_t1 = 0
514
515 IF (parpiv_t1.EQ.-2) THEN
516 IF (keep(19).NE.0) THEN
517
518
519 parpiv_t1 = 0
520 ENDIF
521 ENDIF
522 id%KEEP(269) = parpiv_t1
523 ENDIF
525 & master,
id%COMM, ierr)
526 CALL mpi_bcast( keep(269), 1, mpi_integer,
527 & master,
id%COMM, ierr )
528 IF (
id%MYID.EQ.master)
THEN
529
530
531
532
533
534
535
536
537 id%KEEP(486) =
id%ICNTL(35)
538 IF (
id%KEEP(486).EQ.1)
THEN
539
541 ENDIF
542 IF (
id%KEEP(486).EQ.4)
id%KEEP(486)=0
543 IF ((
id%KEEP(486).LT.0).OR.(
id%KEEP(486).GT.4))
THEN
544
546 ENDIF
547 IF ((keep(486).NE.0).AND.(keep(494).EQ.0)) THEN
548
549
550 IF (lpok) THEN
551 WRITE(lp,'(A)')
552 & " *** Error with BLR setting "
553 WRITE(lp,'(A)') " *** BLR was not activated during ",
554 & " analysis but is requested during factorization."
555 ENDIF
558 GOTO 105
559 ENDIF
560 keep464copy =
id%ICNTL(38)
561 IF (keep464copy.LT.0.OR.keep464copy.GT.1000) THEN
562
563 keep464copy = 1000
564 ENDIF
565 IF (
id%KEEP(461).LT.1)
THEN
567 ENDIF
568 keep465copy=0
569 IF (
id%ICNTL(36).EQ.1.OR.
id%ICNTL(36).EQ.3)
THEN
570 IF (cntl1.EQ.zero .OR. keep(468).LE.1) THEN
571 keep(475) = 3
572 ELSE IF ( (keep(269).GT.0).OR. (keep(269).EQ.-2)) THEN
573 keep(475) = 2
574 ELSE IF (keep(468).EQ.2) THEN
575 keep(475) = 2
576 ELSE
577 keep(475) = 1
578 ENDIF
579 ELSE
580 keep(475) = 0
581 ENDIF
582 keep(481)=0
583 IF (
id%ICNTL(36).LT.0 .OR.
id%ICNTL(36).GE.2)
THEN
584
585 keep(475) = 0
586 ENDIF
587
588 IF (
id%ICNTL(37).EQ.0.OR.
id%ICNTL(37).EQ.1)
THEN
589 keep(489) =
id%ICNTL(37)
590 ELSE
591
592 keep(489) = 0
593 ENDIF
594 IF (keep(79).GE.1) THEN
595
596 keep(489)=0
597 ENDIF
598 keep(489)=0
599
600 IF ((
id%KEEP(476).GT.100).OR.(
id%KEEP(476).LT.1))
THEN
602 ENDIF
603
604 IF ((
id%KEEP(477).GT.100).OR.(
id%KEEP(477).LT.1))
THEN
606 ENDIF
607
608 IF ((
id%KEEP(483).GT.100).OR.(
id%KEEP(483).LT.1))
THEN
610 ENDIF
611
612 IF ((
id%KEEP(484).GT.100).OR.(
id%KEEP(484).LT.1))
THEN
614 ENDIF
615
616 IF ((
id%KEEP(480).GT.6).OR.(
id%KEEP(480).LT.0)
617 & .OR.(
id%KEEP(480).EQ.1))
THEN
619 ENDIF
620
621 IF ((
id%KEEP(473).NE.0).AND.(
id%KEEP(473).NE.1))
THEN
623 ENDIF
624
625 IF ((
id%KEEP(474).GT.3).OR.(
id%KEEP(474).LT.0))
THEN
627 ENDIF
628
629 IF (
id%KEEP(479).LE.0)
THEN
631 ENDIF
632 IF (
id%KEEP(474).NE.0.AND.
id%KEEP(480).EQ.0)
THEN
634 ENDIF
635 IF (
id%KEEP(478).NE.0.AND.
id%KEEP(480).LT.4)
THEN
637 ENDIF
638 IF (
id%KEEP(480).GE.5 .OR.
639 & (
id%KEEP(480).NE.0.AND.
id%KEEP(474).EQ.3))
THEN
640 IF (
id%KEEP(475).LT.2)
THEN
641
642 id%KEEP(480) =
id%KEEP(480) - 2
643 write(*,*)
' Resetting KEEP(480) to ',
id%KEEP(480)
644 ENDIF
645 ENDIF
646 105 CONTINUE
647 ENDIF
650
651 IF (
id%INFO(1).LT.0)
GOTO 530
652 CALL mpi_bcast( keep(473), 14, mpi_integer,
653 & master,
id%COMM, ierr )
654 IF (keep(486).NE.0) THEN
655 CALL mpi_bcast( keep(489), 1, mpi_integer,
656 & master,
id%COMM, ierr )
657 CALL mpi_bcast( keep464copy, 1, mpi_integer,
658 & master,
id%COMM, ierr )
659 CALL mpi_bcast( keep465copy, 1, mpi_integer,
660 & master,
id%COMM, ierr )
661 ENDIF
662 IF (
id%MYID.EQ.master)
THEN
663 IF (keep(217).GT.2.OR.keep(217).LT.0) THEN
664 keep(217)=0
665 ENDIF
666 keep(214)=keep(217)
667 IF (keep(214).EQ.0) THEN
668 IF (keep(201).NE.0) THEN
669 keep(214)=1
670 ELSE
671 keep(214)=2
672 ENDIF
673 IF (keep(486).EQ.2) THEN
674 keep(214)=1
675 ENDIF
676 ENDIF
677 ENDIF
678 CALL mpi_bcast( keep(214), 1, mpi_integer,
679 & master,
id%COMM, ierr )
680 IF (keep(201).NE.0) THEN
681
682 CALL mpi_bcast( keep(99), 1, mpi_integer,
683 & master,
id%COMM, ierr )
684 CALL mpi_bcast( keep(205), 1, mpi_integer,
685 & master,
id%COMM, ierr )
686 CALL mpi_bcast( keep(211), 1, mpi_integer,
687 & master,
id%COMM, ierr )
688 ENDIF
689
690
691 IF (
id%KEEP(252).EQ.1 .AND.
id%MYID.EQ.master)
THEN
692 IF (
id%ICNTL(20).EQ.1)
THEN
693
694
695
698 IF (lpok) WRITE(lp,'(A)')
699 & ' ERROR: Sparse RHS is incompatible with forward',
700 & ' performed during factorization (ICNTL(32)=1)'
701 ELSE IF (
id%ICNTL(30).NE.0)
THEN
704 IF (lpok) WRITE(lp,'(A)')
705 & ' ERROR: A-1 functionality incompatible with forward',
706 & ' performed during factorization (ICNTL(32)=1)'
707 ELSE IF (
id%ICNTL(9) .NE. 1)
THEN
710 IF (lpok) WRITE(lp,'(A)')
711 & .NE.' ERROR: Transpose system (ICNTL(9)0) not ',
712 & ' compatible with forward performed during',
713 & ' factorization (ICNTL(32)=1)'
714 ENDIF
715 ENDIF
718
719 IF (
id%INFO(1).LT.0)
GOTO 530
720
721
722
723
724
725 IF ( icntl(23) .GT. 0 ) THEN
726 itmp = 1
727 ELSE
728 itmp = 0
729 ENDIF
731 & mpi_sum,
id%COMM, ierr)
732 IF (
id%MYID.EQ.master )
THEN
733
734 itmp =
max(icntl(23),0)
735 END IF
737 & master,
id%COMM, ierr )
738
739
740 IF ( itmp .GT. 0 .AND. jtmp .EQ. 1 ) THEN
741
742 ELSE
743
744
745 itmp = icntl(23)
746 ENDIF
747
748 itmp8 = int(itmp, 8)
749 id%KEEP8(4) = itmp8 * 1000000_8
750
752 & mpi_sum, master,
id%COMM, ierr )
753 itmp8 = itmp8 / 1000000_8
754 IF ( prokg ) THEN
755 nworking =
id%NSLAVES
756 WRITE( mpg, 172 ) nworking,
id%ICNTL(22), keep(486),
757 & keep(12),
758 &
id%KEEP8(111), keep(126), keep(127), keep(28),
759 &
id%KEEP8(4)/1000000_8, itmp8, lwk_user_sum8, cntl1
760 IF (keep(252).GT.0)
761 & WRITE(mpg,173) keep(253)
762 IF (keep(269).NE.0)
763 & WRITE(mpg,174) keep(269)
764 ENDIF
765 IF (keep(201).LE.0) THEN
766
767 keep(ixsz)=xsize_ic
768 ELSE IF (keep(201).EQ.2) THEN
769
770 keep(ixsz)=xsize_ooc_nopanel
771 ELSE IF (keep(201).EQ.1) THEN
772
773 IF (keep(50).EQ.0) THEN
774 keep(ixsz)=xsize_ooc_unsym
775 ELSE
776 keep(ixsz)=xsize_ooc_sym
777 ENDIF
778 ENDIF
779 IF ( keep(486) .NE. 0 ) THEN
780
782 END IF
783
784
785
786
787
788 IF (
id%MYID.EQ.master) keep(258)=icntl(33)
789 CALL mpi_bcast(keep(258), 1, mpi_integer,
790 & master,
id%COMM, ierr)
791 IF (keep(258) .NE. 0) THEN
792 keep(259) = 0
793 keep(260) = 1
796 ENDIF
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
816 & master,
id%COMM, ierr)
817 lscal = ((keep(52) .GT. 0) .AND. (keep(52) .LE. 8))
818 IF (lscal) THEN
819
820 IF (
id%MYID.EQ.master )
THEN
822 ENDIF
823
824
825
826
827 IF (keep(52) .EQ. 7) THEN
828
829 k231= keep(231)
830 k232= keep(232)
831 k233= keep(233)
832 ELSEIF (keep(52) .EQ. 8) THEN
833
834 k231= keep(239)
835 k232= keep(240)
836 k233= keep(241)
837 ENDIF
840
841 IF ( ((keep(52).EQ.7).OR.(keep(52).EQ.8)) .AND.
842 & keep(54).NE.0 ) THEN
843
844
845
846
847
848
849 IF (
id%MYID .NE. master )
THEN
850 IF (
associated(
id%COLSCA))
851 &
DEALLOCATE(
id%COLSCA )
852 IF (
associated(
id%ROWSCA))
853 &
DEALLOCATE(
id%ROWSCA )
854 ALLOCATE(
id%COLSCA(n), stat=ierr)
855 IF (ierr .GT.0) THEN
858 ENDIF
859 ALLOCATE(
id%ROWSCA(n), stat=ierr)
860 IF (ierr .GT.0) THEN
863 ENDIF
864 ENDIF
865 m = n
866 bumaxmn=m
867 IF(n > bumaxmn) bumaxmn = n
868 liwk = 4*bumaxmn
869 ALLOCATE (iwk(liwk),burp(m),bucp(n),
870 & burs(2* (
id%NPROCS)),bucs(2* (
id%NPROCS)),
871 & stat=allocok)
872 IF (allocok > 0) THEN
874 id%INFO(2)=liwk+m+n+4* (
id%NPROCS)
875 ENDIF
876
879 IF (
id%INFO(1).LT.0)
GOTO 517
880
881 bujob = 1
882
883 lwk_real = 1
884 ALLOCATE(wk_real(lwk_real),
885 & stat=allocok)
886 IF (allocok > 0) THEN
889 ENDIF
890
893 IF (
id%INFO(1).LT.0)
GOTO 517
895 & myirn_loc(1), myjcn_loc(1), mya_loc(1),
897 & m, n,
id%NPROCS,
id%MYID,
id%COMM,
898 & burp, bucp,
899 & burs, bucs, buregistre,
900 & iwk, liwk,
901 & buintsz, buresz, bujob,
902 &
id%ROWSCA(1),
id%COLSCA(1), wk_real, lwk_real,
904 & k231, k232, k233,
906 & sconeerr, scinferr)
907 IF(liwk < buintsz) THEN
908 DEALLOCATE(iwk)
909 liwk = buintsz
910 ALLOCATE(iwk(liwk), stat=allocok)
911 IF (allocok > 0) THEN
914 ENDIF
915 ENDIF
916 lwk_real = buresz
917 DEALLOCATE(wk_real)
918 ALLOCATE (wk_real(lwk_real), stat=allocok)
919 IF (allocok > 0) THEN
922 ENDIF
923
926 IF (
id%INFO(1).LT.0)
GOTO 517
927
928 bujob = 2
930 & myirn_loc(1), myjcn_loc(1), mya_loc(1),
932 & m, n,
id%NPROCS,
id%MYID,
id%COMM,
933 & burp, bucp,
934 & burs, bucs, buregistre,
935 & iwk, liwk,
936 & buintsz, buresz, bujob,
937 &
id%ROWSCA(1),
id%COLSCA(1), wk_real, lwk_real,
939 & k231, k232, k233,
941 & sconeerr, scinferr)
942 id%DKEEP(4) = sconeerr
943 id%DKEEP(5) = scinferr
944
945 DEALLOCATE(iwk, wk_real,burp,bucp,burs, bucs)
946 ELSE IF ( keep(54) .EQ. 0 ) THEN
947
948
949
950 IF ((keep(52).EQ.7).OR.(keep(52).EQ.8)) THEN
951
952
953
954 IF (
id%MYID.EQ.master)
THEN
955 colour = 0
956 ELSE
957 colour = mpi_undefined
958 ENDIF
960 & comm_for_scaling, ierr )
961 IF (
id%MYID.EQ.master)
THEN
962 m = n
963 bumaxmn=n
964 IF(n > bumaxmn) bumaxmn = n
965 liwk = 1
966 ALLOCATE(iwk(liwk),burp(1),bucp(1),
967 & burs(1),bucs(1),
968 & stat=allocok)
969 IF (allocok > 0) THEN
971 id%INFO(2)=liwk+1+1+1+1
972 GOTO 400
973 ENDIF
974 lwk_real = m + n
975 ALLOCATE (wk_real(lwk_real), stat=allocok)
976 IF (allocok > 0) THEN
979 GOTO 400
980 ENDIF
983 bujob = 1
985 &
id%IRN(1),
id%JCN(1),
id%A(1),
987 & m, n, scnprocs, scmyid, comm_for_scaling,
988 & burp, bucp,
989 & burs, bucs, buregistre,
990 & iwk, liwk,
991 & buintsz, buresz, bujob,
992 &
id%ROWSCA(1),
id%COLSCA(1), wk_real, lwk_real,
994 & k231, k232, k233,
996 & sconeerr, scinferr)
997 IF(lwk_real < buresz) THEN
999 GOTO 400
1000 ENDIF
1001 bujob = 2
1003 &
id%JCN(1),
id%A(1),
1005 & m, n, scnprocs, scmyid, comm_for_scaling,
1006 & burp, bucp,
1007 & burs, bucs, buregistre,
1008 & iwk, liwk,
1009 & buintsz, buresz, bujob,
1010 &
id%ROWSCA(1),
id%COLSCA(1), wk_real, lwk_real,
1012 & k231, k232, k233,
1014 & sconeerr, scinferr)
1015 id%DKEEP(4) = sconeerr
1016 id%DKEEP(5) = scinferr
1017 400 CONTINUE
1018 IF (allocated(wk_real)) DEALLOCATE(wk_real)
1019 IF (allocated(iwk)) DEALLOCATE(iwk)
1020 IF (allocated(burp)) DEALLOCATE(burp)
1021 IF (allocated(bucp)) DEALLOCATE(bucp)
1022 IF (allocated(burs)) DEALLOCATE(burs)
1023 IF (allocated(bucs)) DEALLOCATE(bucs)
1024 ENDIF
1025
1027 & master,
id%COMM, ierr )
1028 IF (
id%MYID.EQ.master)
THEN
1029
1030
1032 ENDIF
1035 IF (
id%INFO(1).LT.0)
GOTO 517
1036 ELSE IF (
id%MYID.EQ.master)
THEN
1037
1038
1039
1040 IF (keep(52).GT.0 .AND. keep(52).LE.6) THEN
1041
1042
1043
1044
1045 IF ( keep(52) .eq. 5 .or.
1046 & keep(52) .eq. 6 ) THEN
1047
1048
1049
1050
1052 ELSE
1053 lwk = 1_8
1054 END IF
1055 lwk_real = 5 * n
1056 ALLOCATE( wk_real( lwk_real ), stat = ierr )
1057 IF ( ierr .GT. 0 ) THEN
1059 id%INFO(2) = lwk_real
1060 GOTO 137
1061 END IF
1062 ALLOCATE( wk( lwk ), stat = ierr )
1063 IF ( ierr .GT. 0 ) THEN
1066 GOTO 137
1067 END IF
1069 &
id%IRN(1),
id%JCN(1),
1070 &
id%COLSCA(1),
id%ROWSCA(1),
1071 & wk, lwk, wk_real, lwk_real, icntl(1),
id%INFO(1) )
1072 DEALLOCATE( wk_real )
1073 DEALLOCATE( wk )
1074 ENDIF
1075 ENDIF
1076 ENDIF
1077 IF (keep(125).NE.0) THEN
1078
1079
1080
1081
1082
1083 IF ((keep(60).GT.0) .and. (keep(116).GT.0)) THEN
1084
1085 IF ( ((keep(52).EQ.7).OR.(keep(52).EQ.8)) .AND.
1086 & keep(54).NE.0 ) THEN
1087
1088 DO i=1, n
1089 IF (
id%SYM_PERM(i).GT.
id%N-keep(116))
THEN
1092 ENDIF
1093 ENDDO
1094 ELSE IF (
id%MYID .EQ. master)
THEN
1095
1096 DO i=1, n
1097 IF (
id%SYM_PERM(i).GT.
id%N-keep(116))
THEN
1100 ENDIF
1101 ENDDO
1102 ENDIF
1103 ENDIF
1104 ENDIF
1105 IF (
id%MYID.EQ.master)
THEN
1107 id%DKEEP(92)=real(timeet)
1108
1109
1110
1111 IF (prokg.AND.(keep(52).EQ.7.OR.keep(52).EQ.8)
1112 & .AND. (k233+k231+k232).GT.0) THEN
1113 IF (k232.GT.0)
WRITE(mpg, 166)
id%DKEEP(4)
1114 ENDIF
1115 ENDIF
1116 ENDIF
1117
1118
1119 lscal = (lscal .OR. (keep(52) .EQ. -1) .OR. keep(52) .EQ. -2)
1120 IF (lscal .AND. keep(258).NE.0 .AND.
id%MYID .EQ. master)
THEN
1124 & keep(259))
1125 ENDDO
1126 IF (keep(50) .EQ. 0) THEN
1130 & keep(259))
1131 ENDDO
1132 ELSE
1133
1134
1135
1136
1137
1138
1140 ENDIF
1141
1142
1144 ENDIF
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156 137 CONTINUE
1157
1158
1159
1160
1161
1162
1163
1164
1165 IF (
associated(
id%root%RHS_CNTR_MASTER_ROOT))
THEN
1166 DEALLOCATE (
id%root%RHS_CNTR_MASTER_ROOT)
1167 NULLIFY (
id%root%RHS_CNTR_MASTER_ROOT)
1168 ENDIF
1169
1170 IF (
id%MYID.EQ.master.AND. keep(252).EQ.1 .AND.
1171 &
id%NRHS .NE.
id%KEEP(253) )
THEN
1172
1173
1175 id%INFO(2)=
id%KEEP(253)
1176 ENDIF
1177
1178
1179 IF (
id%KEEP(252) .EQ. 1)
THEN
1180 IF (
id%MYID.NE.master )
THEN
1182 id%KEEP(255) = n*
id%KEEP(253)
1183 ALLOCATE(rhs_mumps(
id%KEEP(255)),stat=ierr)
1184 IF (ierr > 0) THEN
1186 id%INFO(2)=
id%KEEP(255)
1187 IF (lpok)
1188 & WRITE(lp,*) 'ERROR while allocating RHS on a slave'
1189 NULLIFY(rhs_mumps)
1190 ENDIF
1191 rhs_mumps_allocated = .true.
1192 ELSE
1193
1194 id%KEEP(254)=
id%LRHS
1195 id%KEEP(255)=
id%LRHS*(
id%KEEP(253)-1)+
id%N
1197 rhs_mumps_allocated = .false.
1198 IF (lscal) THEN
1199
1200
1201
1202 DO k=1,
id%KEEP(253)
1203 DO i=1, n
1204 rhs_mumps(
id%KEEP(254) * (k-1) + i )
1205 & = rhs_mumps(
id%KEEP(254) * (k-1) + i )
1207 ENDDO
1208 ENDDO
1209 ENDIF
1210 ENDIF
1211 ELSE
1213 ALLOCATE(rhs_mumps(1),stat=ierr)
1214 IF (ierr > 0) THEN
1217 IF (lpok)
1218 & WRITE(lp,*) 'ERREUR while allocating RHS on a slave'
1219 NULLIFY(rhs_mumps)
1220 ENDIF
1221 rhs_mumps_allocated = .true.
1222 ENDIF
1224 &
id%COMM,
id%MYID )
1225 IF (
id%INFO(1).lt.0 )
GOTO 517
1226 IF (keep(252) .EQ. 1) THEN
1227
1228
1229
1230
1231
1232 DO i= 1,
id%KEEP(253)
1233 CALL mpi_bcast(rhs_mumps((i-1)*
id%KEEP(254)+1), n,
1234 & mpi_complex, master,
id%COMM,ierr)
1235 END DO
1236 ENDIF
1237
1238
1239 keep(110)=
id%ICNTL(24)
1240 CALL mpi_bcast(keep(110), 1, mpi_integer,
1241 & master,
id%COMM, ierr)
1242
1243 IF (keep(110).NE.1) keep(110)=0
1244 IF (keep(219).NE.0) THEN
1246 IF (ierr .NE. 0) THEN
1247
1248
1249
1251 id%INFO(2) =
max(keep(108),1)
1252 END IF
1253 ENDIF
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267 IF (
id%MYID .EQ. master) cntl3 =
id%CNTL(3)
1269 & master,
id%COMM, ierr)
1270 IF (
id%MYID .EQ. master) cntl5 =
id%CNTL(5)
1272 & master,
id%COMM, ierr)
1273 IF (
id%MYID .EQ. master) cntl6 =
id%CNTL(6)
1275 & master,
id%COMM, ierr)
1276 IF (
id%MYID .EQ. master)
id%DKEEP(8) =
id%CNTL(7)
1278 & master,
id%COMM, ierr)
1279 id%DKEEP(11) =
id%DKEEP(8)/
id%KEEP(461)
1280 id%DKEEP(12) =
id%DKEEP(8)/
id%KEEP(462)
1281 IF (keep(486).EQ.0)
id%DKEEP(8) = zero
1282 compute_anorminf = .false.
1283 IF ( (keep(486) .NE. 0).AND. (
id%DKEEP(8).LT.zero))
THEN
1284 compute_anorminf = .true.
1285 ENDIF
1286 IF (keep(19).NE.0) THEN
1287
1288 compute_anorminf = .true.
1289 ENDIF
1290 IF (keep(110).NE.0) THEN
1291
1292 compute_anorminf = .true.
1293 ENDIF
1294 IF (
id%DKEEP(8).LT.zero)
THEN
1295
1296 IF (compute_anorminf) THEN
1297 eff_size_schur = 0
1299
1300 ELSE
1301 anorminf = zero
1302 ENDIF
1303 id%DKEEP(8) = abs(
id%DKEEP(8))*anorminf
1304
1305 IF ((keep(60).GT.0).AND.keep(116).GT.0) anorminf=zero
1306 ENDIF
1307
1308
1309
1310
1311 IF (compute_anorminf) THEN
1312 eff_size_schur = 0
1313 IF (keep(60).GT.0) eff_size_schur = keep(116)
1315 ELSE
1316 anorminf = zero
1317 ENDIF
1318
1319 IF ((keep(19).NE.0).OR.(keep(110).NE.0)) THEN
1320 IF (prokg) THEN
1321 IF (keep(19).NE.0) THEN
1322 WRITE(mpg,'(A,1PD16.4)')
1323 & ' CNTL(3) for null pivot rows/singularities =',cntl3
1324 ELSE
1325 WRITE(mpg,'(A,1PD16.4)')
1326 & ' CNTL(3) for null pivot row detection =',cntl3
1327 ENDIF
1328 ENDIF
1329 ENDIF
1330 IF (keep(19).EQ.0) THEN
1331
1332 seuil = zero
1334 ELSE
1335
1336
1337
1338
1339
1340
1341 IF (cntl3 .LT. zero) THEN
1342 id%DKEEP(9) = abs(cntl(3))
1343 ELSE IF (cntl3 .GT. zero) THEN
1344 id%DKEEP(9) = cntl3*anorminf
1345 ELSE
1346 ENDIF
1347 IF (prokg) THEN
1348 WRITE(mpg, '(A,I16)')
1349 & ' ICNTL(56) rank revealing effective value =',keep(19)
1350 WRITE(mpg,'(A,1PD16.4)')
1351 &
' ...Threshold for singularities on the root =',
id%DKEEP(9)
1352 ENDIF
1353
1354
1355
1356
1357 thresh_seuil =
id%DKEEP(13)
1358 IF (
id%DKEEP(13).LT.1) thresh_seuil = 10
1359 seuil =
id%DKEEP(9)*thresh_seuil
1360 IF (prokg) WRITE(mpg,'(A,1PD16.4)')
1361 & ' ...Threshold for postponing =',seuil
1362 ENDIF
1363 seuil_ldlt_niv2 = seuil
1364
1365
1366
1367 IF (keep(110).EQ.0) THEN
1368
1369
1370
1371
1372
1373 id%DKEEP(1) = -1.0e0
1375 ELSE
1376
1377 IF (keep(19).NE.0) THEN
1378
1379
1380
1381
1382 IF ((
id%DKEEP(10).LE.0).OR.(
id%DKEEP(10).GT.1))
THEN
1383
1384 id%DKEEP(1) =
id%DKEEP(9)*1e-1
1385 ELSE
1386 id%DKEEP(1) =
id%DKEEP(9)*
id%DKEEP(10)
1387 ENDIF
1388 ELSE
1389
1390
1391
1392 IF (cntl3 .LT. zero) THEN
1393 id%DKEEP(1) = abs(cntl(3))
1394 ELSE IF (cntl3 .GT. zero) THEN
1395 id%DKEEP(1) = cntl3*anorminf
1396 ELSE
1397
1399 & n, keep(28),
id%STEP(1),
id%FRERE_STEPS(1),
id%FILS(1),
1400 &
id%NA(1),
id%LNA,
id%NE_STEPS(1), npiv_critical_path )
1401 id%DKEEP(1) = sqrt(real(npiv_critical_path))*eps*anorminf
1402 ENDIF
1403 ENDIF
1404 IF ((keep(110).NE.0).AND.(prokg)) THEN
1405 WRITE(mpg, '(A,I16)')
1406 & ' ICNTL(24) null pivot rows detection =',keep(110)
1407 WRITE(mpg,'(A,1PD16.4)')
1408 &
' ...Zero pivot detection threshold =',
id%DKEEP(1)
1409 ENDIF
1410 IF (cntl5.GT.zero) THEN
1411 id%DKEEP(2) = cntl5 * anorminf
1412 IF (prokg) WRITE(mpg,'(A,1PD10.3)')
1413 &
' ...Fixation for null pivots =',
id%DKEEP(2)
1414 ELSE
1415 IF (prokg) WRITE(mpg,*) '...Infinite fixation '
1416 IF (
id%KEEP(50).EQ.0)
THEN
1417
1418
1419
1420 id%DKEEP(2) = -
max(1.0e10*anorminf,
1421 & sqrt(huge(anorminf))/1.0e8)
1422 ELSE
1423
1425 ENDIF
1426 ENDIF
1427 ENDIF
1428
1429 IF (keep(53).NE.0) THEN
1432 IF ( keep( 46 ) .NE. 1 ) THEN
1433 id_root = id_root + 1
1434 END IF
1435 ENDIF
1436
1437
1438 lpn_list = 1
1439 IF (
associated(
id%PIVNUL_LIST) )
DEALLOCATE(
id%PIVNUL_LIST)
1440 IF(keep(110) .EQ. 1) THEN
1441 lpn_list = n
1442 ENDIF
1443 IF (keep(19).NE.0 .AND.
1444 & (id_root.EQ.
id%MYID .OR.
id%MYID.EQ.master))
THEN
1445 lpn_list = n
1446 ENDIF
1447 ALLOCATE(
id%PIVNUL_LIST(lpn_list),stat = ierr )
1448 IF ( ierr .GT. 0 ) THEN
1451 END IF
1452 id%PIVNUL_LIST(1:lpn_list) = 0
1453 keep(109) = 0
1454
1456 &
id%COMM,
id%MYID )
1457 IF (
id%INFO(1).lt.0 )
GOTO 517
1458
1459
1460
1461
1462 keep(97) = 0
1463 IF ((keep(19).EQ.0).AND.(keep(110).EQ.0)) THEN
1464 IF (
id%MYID .EQ. master) cntl4 =
id%CNTL(4)
1466 & master,
id%COMM, ierr )
1467
1468 IF ( cntl4 .GE. zero ) THEN
1469 keep(97) = 1
1470 IF ( cntl4 .EQ. zero ) THEN
1471
1472 IF(anorminf .EQ. zero) THEN
1473 eff_size_schur = 0
1474 IF (keep(60).GT.0) eff_size_schur = keep(116)
1476 & eff_size_schur )
1477 ENDIF
1478 seuil = sqrt(eps) * anorminf
1479 ELSE
1480 seuil = cntl4
1481 ENDIF
1482 seuil_ldlt_niv2 = seuil
1483 ELSE
1484 seuil = zero
1485 ENDIF
1486 ENDIF
1487
1488
1489
1490 keep(98) = 0
1491 keep(103) = 0
1492 keep(105) = 0
1493 maxs = 1_8
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1509 & maxs_base8, maxs_base_relaxed8,
1510 & blr_strat,
1511 &
id%KEEP(1),
id%KEEP8(1))
1512
1513 maxs = maxs_base_relaxed8
1514 IF (wk_user_provided) THEN
1515
1517 ENDIF
1519 &
id%COMM,
id%MYID )
1520 IF (
id%INFO(1) .LT. 0)
THEN
1521 GOTO 517
1522 ENDIF
1523
1524 id%KEEP8(75) = huge(
id%KEEP8(75))
1525 id%KEEP8(76) = huge(
id%KEEP8(76))
1526 IF (i_am_slave) THEN
1527
1528 IF (
id%KEEP8(4) .NE. 0_8)
THEN
1529
1530 IF ( .NOT. wk_user_provided ) THEN
1531
1533 & maxs,
1534 & blr_strat,
id%KEEP(201), maxs_base_relaxed8,
1535 &
id%KEEP(1),
id%KEEP8(1),
id%MYID,
id%N,
id%NELT,
1536 &
id%NA(1),
id%LNA,
id%NSLAVES,
1537 & keep464copy, keep465copy,
1538 &
id%INFO(1),
id%INFO(2)
1539 & ,
id%I8_L0_OMP(1,1),
size(
id%I8_L0_OMP,1),
1540 &
size(
id%I8_L0_OMP,2)
1541 & )
1542
1543
1544
1547 & .false.,
1548 & n,
id%NELT,
id%NA(1),
id%LNA,
id%NSLAVES,
1549 & blr_strat,
id%KEEP(201),
1550 &
id%KEEP,
id%KEEP8,
id%INFO(1),
id%INFO(2)
1551 & ,
id%I8_L0_OMP(1,1),
size(
id%I8_L0_OMP,1),
1552 &
size(
id%I8_L0_OMP,2)
1553 & )
1554 ELSE
1555
1558 & .false.,
1559 & n,
id%NELT,
id%NA(1),
id%LNA,
id%NSLAVES,
1560 & blr_strat,
id%KEEP(201),
1561 &
id%KEEP,
id%KEEP8,
id%INFO(1),
id%INFO(2)
1562 & ,
id%I8_L0_OMP(1,1),
size(
id%I8_L0_OMP,1),
1563 &
size(
id%I8_L0_OMP,2)
1564 & )
1565 ENDIF
1566 IF (keep(400) .GT.0) THEN
1567
1568
1569
1570
1571
1572 id%KEEP8(76) =
id%KEEP8(75)
1574 & 0_8,
1576 & .true.,
1577 &
id%N,
id%NELT,
id%NA(1),
id%LNA,
id%NSLAVES,
1578 & blr_strat,
id%KEEP(201),
1579 &
id%KEEP,
id%KEEP8,
id%INFO(1),
id%INFO(2)
1580 & ,
id%I8_L0_OMP(1,1),
size(
id%I8_L0_OMP,1),
1581 &
size(
id%I8_L0_OMP,2)
1582 & )
1583
1584
1585
1586
1587 ENDIF
1588 ENDIF
1589
1590 ENDIF
1591
1592 IF (i_am_slave) THEN
1593 IF ( (keep(400).GT.0) .AND. (keep(406).EQ.2) ) THEN
1594
1595
1598 &
id%NELT,
id%NA(1),
id%LNA,
id%NSLAVES,
1599 & blr_strat,
id%KEEP(201),
1600 &
id%KEEP(1),
id%KEEP8(1),
id%INFO(1),
id%INFO(2)
1601 & ,
id%I8_L0_OMP(1,1),
size(
id%I8_L0_OMP,1),
1602 &
size(
id%I8_L0_OMP,2)
1603 & )
1604 ENDIF
1605 ENDIF
1606
1608 &
id%COMM,
id%MYID )
1609 IF (
id%INFO(1) .LT. 0)
THEN
1610 GOTO 517
1611 ENDIF
1614 & print_maxavg,
1615 &
id%COMM,
" Effective size of S (based on INFO(39))= ")
1616
1617 IF ( i_am_slave ) THEN
1618
1619
1620
1622 & keep(64),
id%DKEEP(15), keep(375), maxs )
1623 k28=keep(28)
1624 memory_md_arg =
min(int(perlu,8) * ( maxs_base8 / 100_8 + 1_8 ),
1625
1626
1627
1628 &
max(0_8, maxs-maxs_base8))
1630
1631
1632
1633
1634
1636 IF (ierr < 0) THEN
1639 GOTO 112
1640 ENDIF
1641 IF (keep(201) .GT. 0) THEN
1642
1643
1644
1645 IF (keep(201).EQ.1
1646 & .AND.keep(50).EQ.0
1647 & .AND.keep(251).NE.2
1648 & ) THEN
1649 id%OOC_NB_FILE_TYPE=2
1650 ELSE
1651 id%OOC_NB_FILE_TYPE=1
1652 ENDIF
1653
1654
1655
1656 IF (keep(205) .GT. 0) THEN
1657 keep(100) = keep(205)
1658 ELSE
1659 IF (keep(201).EQ.1) THEN
1660 i8tmp = int(
id%OOC_NB_FILE_TYPE,8) *
1661 & 2_8 * int(keep(226),8)
1662 ELSE
1663 i8tmp = 2_8 *
id%KEEP8(119)
1664 ENDIF
1665 i8tmp = i8tmp + int(
max(keep(12),0),8) *
1666 & (i8tmp/100_8+1_8)
1667
1668
1669 i8tmp =
min(i8tmp, 12000000_8)
1670 keep(100)=int(i8tmp)
1671 ENDIF
1672 IF (keep(201).EQ.1) THEN
1673
1674 IF ( keep(99) < 3 ) THEN
1675 keep(99) = keep(99) + 3
1676 ENDIF
1677 ENDIF
1678
1679
1680
1681
1682 IF (keep(99) .LT.3) keep(100)=0
1683 IF((dble(keep(100))*dble(keep(35))/dble(2)).GT.
1684 & (dble(1999999999)))THEN
1685 IF (prokg) THEN
1686 WRITE(mpg,*)
id%MYID,
': Warning: DIM_BUF_IO might be
1687 & too big for Filesystem'
1688 ENDIF
1689 ENDIF
1690 ALLOCATE (
id%OOC_INODE_SEQUENCE(keep(28),
1691 &
id%OOC_NB_FILE_TYPE),
1692 & stat=ierr)
1693 IF ( ierr .GT. 0 ) THEN
1695 id%INFO(2) =
id%OOC_NB_FILE_TYPE*keep(28)
1696 NULLIFY(
id%OOC_INODE_SEQUENCE)
1697 GOTO 112
1698 ENDIF
1699 ALLOCATE (
id%OOC_TOTAL_NB_NODES(
id%OOC_NB_FILE_TYPE),
1700 & stat=ierr)
1701 IF ( ierr .GT. 0 ) THEN
1703 id%INFO(2) =
id%OOC_NB_FILE_TYPE
1704 NULLIFY(
id%OOC_TOTAL_NB_NODES)
1705 GOTO 112
1706 ENDIF
1707 ALLOCATE (
id%OOC_SIZE_OF_BLOCK(keep(28),
1708 &
id%OOC_NB_FILE_TYPE),
1709 & stat=ierr)
1710 IF ( ierr .GT. 0 ) THEN
1712 id%INFO(2) =
id%OOC_NB_FILE_TYPE*keep(28)
1713 NULLIFY(
id%OOC_SIZE_OF_BLOCK)
1714 GOTO 112
1715 ENDIF
1716 ALLOCATE (
id%OOC_VADDR(keep(28),
id%OOC_NB_FILE_TYPE),
1717 & stat=ierr)
1718 IF ( ierr .GT. 0 ) THEN
1720 id%INFO(2) =
id%OOC_NB_FILE_TYPE*keep(28)
1721 NULLIFY(
id%OOC_VADDR)
1722 GOTO 112
1723 ENDIF
1724 ENDIF
1725 ENDIF
1727 &
id%COMM,
id%MYID )
1728 IF (
id%INFO(1) < 0)
THEN
1729
1730 GOTO 513
1731 ENDIF
1732 IF (i_am_slave) THEN
1733 IF (keep(201) .GT. 0) THEN
1734 IF ((keep(201).EQ.1).OR.(keep(201).EQ.2)) THEN
1736 ELSE
1737 WRITE(*,*) "Internal error in CMUMPS_FAC_DRIVER"
1739 ENDIF
1740 IF(
id%INFO(1).LT.0)
THEN
1741 GOTO 111
1742 ENDIF
1743 ENDIF
1744
1745
1746
1748 &
id%KEEP(1),
id%KEEP8(1))
1749 IF (
id%INFO(1).LT.0)
GOTO 111
1750 END IF
1751
1752
1753
1754 earlyt3rootins = keep(200) .EQ.0
1755 & .OR. ( keep(200) .LT. 0 .AND. keep(400) .EQ. 0 )
1756#if defined (LARGEMATRICES)
1757 IF (
id%MYID .ne. master )
THEN
1758#endif
1759 IF (.NOT.wk_user_provided) THEN
1760 IF ( earlyt3rootins ) THEN
1761
1762 ALLOCATE (
id%S(maxs),stat=ierr)
1764 IF ( ierr .GT. 0 ) THEN
1767
1768
1769
1772 ENDIF
1773 ENDIF
1774 ELSE
1775 id%S =>
id%WK_USER(1:
id%KEEP8(24))
1777 ENDIF
1778#if defined (LARGEMATRICES)
1779 END IF
1780#endif
1781
1783 &
id%COMM,
id%MYID )
1784 IF (
id%INFO(1).LT.0 )
GOTO 514
1785
1786
1787
1788
1789 nb_active_fronts_estim = 3
1790 nb_threads = 1
1791
1792
1793 nb_active_fronts_estim = 3*nb_threads
1794 IF (i_am_slave) THEN
1795
1797
1798 IF ( (keep(486).EQ.2)
1799 & .OR. ((keep(489).NE.0).AND.(keep(400).GT.1))
1800 & ) THEN
1801
1802
1803
1804 nb_fronts_f_estim = keep(470)
1805 ELSE
1806 IF (keep(489).NE.0) THEN
1807
1808
1809
1810 nb_fronts_f_estim = 2*nb_active_fronts_estim
1811 ELSE
1812 nb_fronts_f_estim = nb_active_fronts_estim
1813 ENDIF
1814 ENDIF
1816 IF (
id%INFO(1) .LT. 0 )
GOTO 114
1817#if ! defined(NO_FDM_DESCBAND)
1818
1820#endif
1821#if ! defined(NO_FDM_MAPROW)
1822
1824#endif
1826 114 CONTINUE
1827 ENDIF
1829 &
id%COMM,
id%MYID )
1830
1831 IF (
id%INFO(1).LT.0 )
GOTO 500
1832
1833
1834
1835
1836
1837
1838
1839
1840 IF ( keep(55) .eq. 0 ) THEN
1841
1842
1843
1844
1845
1846 IF (
associated(
id%DBLARR))
THEN
1847 DEALLOCATE(
id%DBLARR)
1849 ENDIF
1850 IF ( i_am_slave .and.
id%KEEP8(26) .ne. 0_8 )
THEN
1851 ALLOCATE(
id%DBLARR(
id%KEEP8(26) ), stat = ierr )
1852 ELSE
1853 ALLOCATE(
id%DBLARR( 1 ), stat =ierr )
1854 END IF
1855 IF ( ierr .NE. 0 ) THEN
1856 IF (lpok) THEN
1857 WRITE(lp,*)
id%MYID,
1858 &
': Allocation error for DBLARR(',
id%KEEP8(26),
')'
1859 ENDIF
1863 GOTO 100
1864 END IF
1865 ELSE
1866
1867
1868
1869 IF (
associated(
id%INTARR ) )
THEN
1870 DEALLOCATE(
id%INTARR )
1871 NULLIFY(
id%INTARR )
1872 END IF
1873 IF ( i_am_slave .and.
id%KEEP8(27) .ne. 0_8 )
THEN
1874 ALLOCATE(
id%INTARR(
id%KEEP8(27) ), stat = allocok )
1875 IF ( allocok .GT. 0 ) THEN
1879 GOTO 100
1880 END IF
1881 ELSE
1882 ALLOCATE(
id%INTARR(1),stat=allocok )
1883 IF ( allocok .GT. 0 ) THEN
1887 GOTO 100
1888 END IF
1889 END IF
1890
1891
1892
1893
1894
1895 IF (
associated(
id%DBLARR))
THEN
1896 DEALLOCATE(
id%DBLARR)
1898 ENDIF
1899 IF ( i_am_slave ) THEN
1900 IF (
id%MYID_NODES .eq. master
1901 & .AND. keep(46) .eq. 1
1902 & .AND. keep(52) .eq. 0 ) THEN
1903
1904
1905
1906 id%DBLARR =>
id%A_ELT
1907 ELSE
1908
1909
1910
1911 IF (
id%KEEP8(26) .ne. 0_8 )
THEN
1912 ALLOCATE(
id%DBLARR(
id%KEEP8(26) ), stat = allocok )
1913 IF ( allocok .GT. 0 ) THEN
1917 GOTO 100
1918 END IF
1919 ELSE
1920 ALLOCATE(
id%DBLARR(1), stat = allocok )
1921 IF ( allocok .GT. 0 ) THEN
1925 GOTO 100
1926 END IF
1927 END IF
1928 END IF
1929 ELSE
1930 ALLOCATE(
id%DBLARR(1), stat = allocok )
1931 IF ( allocok .GT. 0 ) THEN
1935 GOTO 100
1936 END IF
1937 END IF
1938 END IF
1939
1940
1941
1942
1943 IF ( keep(38).NE.0 .AND. i_am_slave ) THEN
1945 &
id%root,
id%FILS(1), keep(38),
id%KEEP(1),
id%INFO(1) )
1946 END IF
1947
1948
1949 100 CONTINUE
1950
1951
1952
1954 &
id%COMM,
id%MYID )
1955 IF (
id%INFO(1).LT.0 )
GOTO 500
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1967
1968
1969
1970
1971
1972
1973 IF (earlyt3rootins) THEN
1975 maxs_arg = maxs
1976 ELSE
1977 s_ptr_arg => s_dummy_arg
1978 maxs_arg = 1
1979 ENDIF
1980
1981 IF ( keep( 55 ) .eq. 0 ) THEN
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007 IF (earlyt3rootins .AND. keep(38).NE.0 .AND.
2008 & keep(60) .EQ.0 .AND. i_am_slave) THEN
2009 lwk = int(
numroc(
id%root%ROOT_SIZE,
id%root%MBLOCK,
2010 &
id%root%MYROW, 0,
id%root%NPROW ),8)
2011 lwk =
max( 1_8, lwk )
2012 lwk = lwk*
2013 & int(
numroc(
id%root%ROOT_SIZE,
id%root%NBLOCK,
2014 &
id%root%MYCOL, 0,
id%root%NPCOL ),8)
2015 lwk =
max( 1_8, lwk )
2016 ELSE
2017 lwk = 1_8
2018 ENDIF
2019
2020
2021
2022 IF (maxs .LT. int(lwk,8)) THEN
2025 ENDIF
2027 &
id%COMM,
id%MYID )
2028 IF (
id%INFO(1).LT.0 )
GOTO 500
2029
2030 IF ( keep(54) .eq. 0 ) THEN
2031
2032
2033
2034
2035
2036 IF (
id%MYID .eq. master )
THEN
2037 ALLOCATE(iwk(
id%N), stat=allocok)
2038 IF ( allocok .NE. 0 ) THEN
2041 END IF
2042#if defined(LARGEMATRICES)
2043 ALLOCATE (wk(lwk),stat=ierr)
2044 IF ( ierr .GT. 0 ) THEN
2047 write(6,*) ' PB1 ALLOC LARGEMAT'
2048 ENDIF
2049#endif
2050 ENDIF
2052 &
id%COMM,
id%MYID )
2053 IF (
id%INFO(1).LT.0 )
GOTO 500
2054 IF (
id%MYID .eq. master )
THEN
2055
2056
2057
2058
2059
2060
2061
2062
2063 IF ( .not.
associated(
id%INTARR ) )
THEN
2064 ALLOCATE(
id%INTARR( 1 ),stat=ierr)
2065 IF ( ierr .GT. 0 ) THEN
2069 write(6,*) ' PB2 ALLOC INTARR'
2071 ENDIF
2072 ENDIF
2073 nbrecords = keep(39)
2074 IF (
id%KEEP8(28) .LT. int(nbrecords,8))
THEN
2075 nbrecords = int(
id%KEEP8(28))
2076 ENDIF
2077#if defined(LARGEMATRICES)
2079 &
id%IRN(1),
id%JCN(1),
id%SYM_PERM(1),
2080 & lscal,
id%COLSCA(1),
id%ROWSCA(1),
2081 &
id%MYID,
id%NSLAVES,
id%PROCNODE_STEPS(1),
2082 & nbrecords,
2083 & lp,
id%COMM,
id%root, keep,
id%KEEP8,
2084 &
id%FILS(1), iwk(1),
2085 &
2086 &
id%INTARR(1),
id%KEEP8(27),
id%DBLARR(1),
id%KEEP8(26),
2087 &
id%PTRAR(1),
id%PTRAR(
id%N+1),
2088 &
id%FRERE_STEPS(1),
id%STEP(1), wk(1), lwk,
2089 &
id%ISTEP_TO_INIV2(1),
id%I_AM_CAND(1),
2090 &
id%CANDIDATES(1,1))
2091
2098 IF (.NOT.wk_user_provided) THEN
2099 IF (earlyt3rootins) THEN
2100 ALLOCATE (
id%S(maxs),stat=ierr)
2102 IF ( ierr .GT. 0 ) THEN
2107 write(6,*) ' PB2 ALLOC LARGEMAT',maxs
2109 ENDIF
2110 ENDIF
2111 ENDIF
2112 ELSE
2113 id%S =>
id%WK_USER(1:
id%KEEP8(24))
2114 ENDIF
2115 IF (earlyt3rootins) THEN
2116 id%S(maxs-lwk+1_8:maxs) = wk(1_8:lwk)
2117 ENDIF
2118 DEALLOCATE (wk)
2119#else
2121 &
id%IRN(1),
id%JCN(1),
id%SYM_PERM(1),
2122 & lscal,
id%COLSCA(1),
id%ROWSCA(1),
2123 &
id%MYID,
id%NSLAVES,
id%PROCNODE_STEPS(1),
2124 & nbrecords,
2125 & lp,
id%COMM,
id%root, keep(1),
id%KEEP8(1),
2126 &
id%FILS(1), iwk(1),
2127 &
2128 &
id%INTARR(1),
id%KEEP8(27),
id%DBLARR(1),
id%KEEP8(26),
2129 &
id%PTRAR(1),
id%PTRAR(
id%N+1),
2130 &
id%FRERE_STEPS(1),
id%STEP(1), s_ptr_arg(1), maxs_arg,
2131 &
id%ISTEP_TO_INIV2(1),
id%I_AM_CAND(1),
2132 &
id%CANDIDATES(1,1) )
2133#endif
2134 DEALLOCATE(iwk)
2135 ELSE
2136 nbrecords = keep(39)
2137 IF (
id%KEEP8(28) .LT. int(nbrecords,8))
THEN
2138 nbrecords = int(
id%KEEP8(28))
2139 ENDIF
2141 &
id%DBLARR(1),
id%KEEP8(26),
2142 &
id%INTARR(1),
id%KEEP8(27),
2145 & keep( 1 ),
id%KEEP8(1),
id%MYID,
id%COMM,
2146 & nbrecords,
2147 &
2148 & s_ptr_arg(1), maxs_arg,
2150 &
id%PROCNODE_STEPS(1),
id%NSLAVES,
2151 &
id%SYM_PERM(1),
id%FRERE_STEPS(1),
id%STEP(1),
2152 &
id%INFO(1),
id%INFO(2) )
2153 ENDIF
2154 ELSE
2155
2156
2157
2158
2159
2160 IF (
id%MYID.EQ.master)
THEN
2162 END IF
2163 IF ( i_am_slave ) THEN
2164
2165
2166
2167
2168
2169
2170
2172 & mpi_max,
id%COMM_NODES, ierr)
2173 nbrecords = keep(39)
2174 IF (nz_locmax8 .LT. int(nbrecords,8)) THEN
2175 nbrecords = int(nz_locmax8)
2176 ENDIF
2180 &
id%DBLARR(1),
id%KEEP8(26),
id%INTARR(1),
2181 &
id%KEEP8(27),
id%PTRAR(1),
id%PTRAR(
id%N+1),
2182 & keep(1),
id%KEEP8(1),
id%MYID_NODES,
2183 &
id%COMM_NODES, nbrecords,
2184 & s_ptr_arg(1), maxs_arg,
id%root,
id%PROCNODE_STEPS(1),
2185 &
id%NSLAVES,
id%SYM_PERM(1),
id%STEP(1),
2186 &
id%ICNTL(1),
id%INFO(1), nsend8, nlocal8,
2187 &
id%ISTEP_TO_INIV2(1),
2188 &
id%CANDIDATES(1,1) )
2189 IF ( ( keep(52).EQ.7 ).OR. (keep(52).EQ.8) ) THEN
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202 IF (
id%MYID > 0 )
THEN
2203 IF (
associated(
id%ROWSCA))
THEN
2204 DEALLOCATE(
id%ROWSCA)
2206 ENDIF
2207 IF (
associated(
id%COLSCA))
THEN
2208 DEALLOCATE(
id%COLSCA)
2210 ENDIF
2211 ENDIF
2212 ENDIF
2213#if defined(LARGEMATRICES)
2214
2215
2216
2217 IF (
associated(
id%IRN_loc))
THEN
2218 DEALLOCATE(
id%IRN_loc)
2220 ENDIF
2221 IF (
associated(
id%JCN_loc))
THEN
2222 DEALLOCATE(
id%JCN_loc)
2224 ENDIF
2225 IF (
associated(
id%A_loc))
THEN
2226 DEALLOCATE(
id%A_loc)
2228 ENDIF
2229 write(6,*) ' Warning :',
2230 & ' id%A_loc, IRN_loc, JCN_loc deallocated !!! '
2231#endif
2232 IF (prok) THEN
2233 WRITE(mp,120) nlocal8, nsend8
2234 END IF
2235 END IF
2236 IF ( keep(46) .eq. 0 .AND.
id%MYID.eq.master )
THEN
2237
2238
2239
2240
2241 nsend8 = 0_8
2242 nlocal8 = 0_8
2243 END IF
2244
2245
2246
2247 CALL mpi_reduce( nsend8, nsend_tot8, 1, mpi_integer8,
2248 & mpi_sum, master,
id%COMM, ierr )
2249 CALL mpi_reduce( nlocal8, nlocal_tot8, 1, mpi_integer8,
2250 & mpi_sum, master,
id%COMM, ierr )
2251 IF ( prokg ) THEN
2252 WRITE(mpg,125) nlocal_tot8, nsend_tot8
2253 END IF
2254
2255
2256
2257
2259 &
id%COMM,
id%MYID )
2260 IF (
id%INFO( 1 ) .LT. 0 )
GOTO 500
2261
2262 ENDIF
2263 ELSE
2264
2265
2266
2267
2268
2269 IF (
id%MYID.eq.master)
2272 & maxelt_size )
2273
2274
2275
2276
2277
2278
2279
2282 &
id%NSLAVES,
id%PTRAR(1),
2283 &
id%PTRAR(
id%NELT+2),
2284 &
id%INTARR(1),
id%DBLARR(1),
id%KEEP8(27),
id%KEEP8(26),
2285 &
id%KEEP(1),
id%KEEP8(1), maxelt_size,
2286 &
id%FRTPTR(1),
id%FRTELT(1),
2287 & s_ptr_arg(1), maxs_arg,
id%FILS(1),
2289
2290
2291
2293 &
id%COMM,
id%MYID )
2294 IF (
id%INFO( 1 ) .LT. 0 )
GOTO 500
2295 END IF
2296
2297
2298
2299 IF (
id%MYID.EQ.master)
THEN
2301 id%DKEEP(93) = real(time)
2302 IF (prokg)
WRITE(mpg,160)
id%DKEEP(93)
2303 END IF
2304 IF ( keep(400) .GT. 0 ) THEN
2305
2306
2307
2308 nomp=1
2309
2310 IF ( nomp .NE. keep(400) ) THEN
2312 id%INFO(2)=keep(400)
2313 IF (lpok) WRITE(lp,'(A,A,I5,A,I5)')
2314 &" FAILURE DETECTED IN FACTORIZATION: #threads for KEEP(401)",
2315 &" changed from",keep(400)," at analysis to", nomp
2316 ENDIF
2317
2319 &
id%COMM,
id%MYID )
2320 IF (
id%INFO( 1 ) .LT. 0 )
GOTO 500
2321 ENDIF
2322
2323
2324
2326
2327
2328
2329
2330 IF ( i_am_slave ) THEN
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347 IF (keep(486).NE.0) THEN
2348 cmumps_lbufr_bytes8 = int(keep( 380 ),8) * int(keep( 35 ),8)
2349 ELSE
2350 cmumps_lbufr_bytes8 = int(keep( 44 ),8) * int(keep( 35 ),8)
2351 ENDIF
2352
2353
2354
2355 cmumps_lbufr_bytes8 =
max( cmumps_lbufr_bytes8,
2356 & 100000_8 )
2357 IF ((keep(50).NE.0).AND.(keep(489).GT.0).AND.
2358 & (
id%NSLAVES.GE.2))
THEN
2359
2360
2361
2362
2363 ratiok465 = real(keep465copy)/real(1000)
2364 cmumps_lbufr_bytes8 =
max(cmumps_lbufr_bytes8,
2365 & int(
2366 & ratiok465*
2367 & real(
2368 & int(keep(2)+1,8)*int(keep(142),8)*int(keep(35),8)
2369 & )
2370 & ,8)
2371 & )
2372 ENDIF
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390 IF (keep(48).EQ.5) THEN
2391 min_perlu = 2
2392 ELSE
2393 min_perlu = 0
2394 ENDIF
2395
2396 cmumps_lbufr_bytes8 = cmumps_lbufr_bytes8
2397 & + int( 2.0e0 * real(
max(perlu,min_perlu))*
2398 & real(cmumps_lbufr_bytes8)/100e0, 8)
2399 cmumps_lbufr_bytes8 =
min(cmumps_lbufr_bytes8,
2400 & int(huge(i4)-100,8))
2401 cmumps_lbufr_bytes = int( cmumps_lbufr_bytes8 )
2402 IF (keep(48)==5) THEN
2403
2404
2405
2406
2407 id%KEEP8(21) =
id%KEEP8(22) +
2408 & int( real(
max(perlu,min_perlu))*
2409 & real(
id%KEEP8(22))/100e0,8)
2410 ENDIF
2411
2412
2413
2414
2415
2416
2417
2418
2419 IF (keep(486).NE.0) THEN
2420 cmumps_lbuf8 = int( real(keep(213)) / 100.0e0 *
2421 & real(keep(379)) * real(keep(35)), 8 )
2422 ELSE
2423 cmumps_lbuf8 = int( real(keep(213)) / 100.0e0 *
2424 & real(keep(43)) * real(keep(35)), 8 )
2425 ENDIF
2426 cmumps_lbuf8 =
max( cmumps_lbuf8, 100000_8 )
2427 cmumps_lbuf8 = cmumps_lbuf8
2428 & + int( 2.0e0 * real(
max(perlu,min_perlu))*
2429 & real(cmumps_lbuf8)/100e0, 8)
2430
2431 cmumps_lbuf8 =
min(cmumps_lbuf8, int(huge(i4)-100,8))
2432
2433
2434
2435
2436 cmumps_lbuf8 =
max(cmumps_lbuf8, cmumps_lbufr_bytes8+3*keep(34))
2437 cmumps_lbuf = int(cmumps_lbuf8)
2438 IF(
id%KEEP(48).EQ.4)
THEN
2439 cmumps_lbufr_bytes=cmumps_lbufr_bytes*5
2440 cmumps_lbuf=cmumps_lbuf*5
2441 ENDIF
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452 cmumps_lbuf_int = ( keep(56) +
id%NSLAVES *
id%NSLAVES ) * 5
2453 & * keep(34)
2454 IF ( keep( 38 ) .NE. 0 ) THEN
2455
2456
2459 IF ( kkkk .EQ.
id%MYID_NODES )
THEN
2460 cmumps_lbuf_int = cmumps_lbuf_int + 4 * keep(34) *
2461 & (
id%NSLAVES +
id%NE_STEPS(
id%STEP(keep(38)))
2462 & +
min(keep(56),
id%NE_STEPS(
id%STEP(keep(38)))) *
id%NSLAVES
2463 & )
2464 END IF
2465 END IF
2466
2467
2468
2469 IF ( prok ) THEN
2470 WRITE( mp, 9999 ) cmumps_lbufr_bytes,
2471 & cmumps_lbuf, cmumps_lbuf_int
2472 END IF
2473 9999 FORMAT( /,' Allocated buffers',/,' ------------------',/,
2474 & ' Size of reception buffer in bytes ...... = ', i10,
2475 & /,
2476 & ' Size of async. emission buffer (bytes).. = ', i10,/,
2477 & ' Small emission buffer (bytes) .......... = ', i10)
2478
2479
2480
2481
2483 IF ( ierr .NE. 0 ) THEN
2485
2486 id%INFO(2)= (cmumps_lbuf_int+keep(34)-1)/keep(34)
2487 IF (lpok) THEN
2488 WRITE(lp,*)
id%MYID,
2489 & ':Allocation error in CMUMPS_BUF_ALLOC_SMALL_BUF'
2491 ENDIF
2492 GO TO 110
2493 END IF
2494
2495
2496
2497
2498
2499 cmumps_lbufr = (cmumps_lbufr_bytes+keep(34)-1)/keep(34)
2500 ALLOCATE( bufr( cmumps_lbufr ),stat=ierr )
2501 IF ( ierr .NE. 0 ) THEN
2503 id%INFO(2) = cmumps_lbufr
2504 IF (lpok) THEN
2505 WRITE(lp,*)
2506 & ': Allocation error for BUFR(', cmumps_lbufr,
2507 &
') on MPI process',
id%MYID
2508 ENDIF
2509 GO TO 110
2510 END IF
2511
2512
2513
2514
2515
2516
2517 perlu = keep( 12 )
2518 IF (keep(201).GT.0) THEN
2519
2520
2521 maxis_estim = keep(225)
2522 ELSE
2523
2524 maxis_estim = keep(15)
2525 ENDIF
2526 maxis =
max( 1, int(
min( int(huge(maxis),8),
2527 & int(maxis_estim,8) + 3_8 *
max(int(perlu,8),10_8) *
2528 & ( int(maxis_estim,8) / 100_8 + 1_8 )
2529 & )
2530 & )
2531 & )
2532
2533
2534
2535
2536
2537
2538
2539 ALLOCATE(
id%PTLUST_S(
id%KEEP(28) ), stat = ierr )
2540 IF ( ierr .NE. 0 ) THEN
2542 id%INFO(2)=
id%KEEP(28)
2543 IF (lpok) THEN
2544 WRITE(lp,*)
id%MYID,
2545 &
': Allocation error for id%PTLUST_S(',
id%KEEP(28),
')'
2546 ENDIF
2547 NULLIFY(
id%PTLUST_S)
2548 GOTO 110
2549 END IF
2550 ALLOCATE(
id%PTRFAC(
id%KEEP(28) ), stat = ierr )
2551 IF ( ierr .NE. 0 ) THEN
2553 id%INFO(2)=
id%KEEP(28)
2555 IF (lpok) THEN
2556 WRITE(lp,*)
id%MYID,
2557 &
': Allocation error for id%PTRFAC(',
id%KEEP(28),
')'
2558 ENDIF
2559 GOTO 110
2560 END IF
2561
2562
2563
2564
2565
2566
2567 ptrist = 1
2568 ptrwb = ptrist +
id%KEEP(28)
2569 itloc = ptrwb + 2 *
id%KEEP(28)
2570
2571 ipool = itloc +
id%N +
id%KEEP(253)
2572
2573
2574
2575
2576
2577
2578
2579
2581 ALLOCATE( iwk( ipool + lpool - 1 ), stat = ierr )
2582 IF ( ierr .NE. 0 ) THEN
2584 id%INFO(2)=ipool + lpool - 1
2585 IF (lpok) THEN
2586 WRITE(lp,*)
id%MYID,
2587 & ': Allocation error for IWK(',ipool+lpool-1,')'
2588 ENDIF
2589 GOTO 110
2590 END IF
2591 ALLOCATE(iwk8( 2 *
id%KEEP(28)), stat = ierr)
2592 IF ( ierr .NE. 0 ) THEN
2594 id%INFO(2)=2 *
id%KEEP(28)
2595 IF (lpok) THEN
2596 WRITE(lp,*)
id%MYID,
2597 &
': Allocation error for IWKB(', 2*
id%KEEP(28),
')'
2598 ENDIF
2599 GOTO 110
2600 END IF
2601
2602
2603
2604 ENDIF
2605
2606 110 CONTINUE
2607
2608
2609
2611 &
id%COMM,
id%MYID )
2612 IF (
id%INFO( 1 ) .LT. 0 )
GOTO 500
2613
2614 IF ( i_am_slave ) THEN
2615
2617 IF (prok) THEN
2618 WRITE( mp, 170 ) maxs, maxis,
id%KEEP8(12), keep(15),
2619 &
id%KEEP8(26),
id%KEEP8(27),
id%KEEP8(11), keep(26), keep(27)
2620 ENDIF
2621 END IF
2622
2623
2624
2625
2626
2627
2628
2629
2631
2632
2633
2635
2636
2639 rinfo(2:3)=zero
2640 IF ( i_am_slave ) THEN
2641
2642
2643
2644 IF ( keep(55) .eq. 0 ) THEN
2646 ELSE
2647 ldptrar =
id%NELT + 1
2648 END IF
2649 IF (
id%KEEP(55) .NE. 0 )
THEN
2651 ELSE
2652
2653
2654
2655
2656 nelt_arg = 1
2657 END IF
2658 ENDIF
2659 IF (i_am_slave) THEN
2660 IF (
associated(
id%L0_OMP_MAPPING))
2661 &
DEALLOCATE(
id%L0_OMP_MAPPING)
2662 IF (keep(400) .GT. 0) THEN
2663 id%LL0_OMP_MAPPING = keep(28)
2664 ELSE
2665 id%LL0_OMP_MAPPING = 1
2666 ENDIF
2667 ALLOCATE(
id%L0_OMP_MAPPING(
id%LL0_OMP_MAPPING), stat=allocok)
2668 IF ( allocok > 0) THEN
2669 write(*,*) "Problem allocating L0_OMP_MAPPING",
2670 & ierr, keep(28)
2671 GOTO 115
2672 ENDIF
2673 IF (
associated(
id%L0_OMP_FACTORS))
THEN
2675 ENDIF
2676 IF (keep(400) .GT. 0) THEN
2677 id%LL0_OMP_FACTORS = keep(400)
2678 ELSE
2679 id%LL0_OMP_FACTORS = 1
2680 ENDIF
2681 ALLOCATE(
id%L0_OMP_FACTORS(
id%LL0_OMP_FACTORS),stat = allocok)
2682 IF (allocok > 0) THEN
2684 id%INFO(2)=nb_threads
2685 GOTO 111
2686 ENDIF
2688 ENDIF
2689 115 CONTINUE
2691 &
id%COMM,
id%MYID )
2692 IF (
id%INFO( 1 ) .LT. 0 )
GOTO 500
2693
2694 avg_flops = rinfog(1)/(real(
id%NSLAVES))
2695 id%DKEEP(17) =
max(
id%DKEEP(18), avg_flops/real(50) )
2696 &
2697 IF (prok.AND.
id%MYID.EQ.master)
THEN
2698 IF (
id%NSLAVES.LE.1)
THEN
2699 WRITE(mp,'(/A,A,1PD10.3)')
2700 &' Start factorization with total',
2701 &' estimated flops (RINFOG(1)) = ',
2702 & rinfog(1)
2703 ELSE
2704 WRITE(mp,'(/A,A,1PD10.3,A,1PD10.3)')
2705 &' Start factorization with total',
2706 &' estimated flops RINFOG(1) / Average per MPI proc = ',
2707 & rinfog(1), ' / ', avg_flops
2708 ENDIF
2709 ENDIF
2710 IF (i_am_slave) THEN
2711
2712
2713
2714
2715
2716
2717
2718 s_is_pointers%IW =>
id%IS;
NULLIFY(
id%IS)
2719 s_is_pointers%A =>
id%S ;
NULLIFY(
id%S)
2721 &
id%NA(1),
id%LNA,
id%NE_STEPS(1),
id%ND_STEPS(1),
id%FILS(1),
2722 &
id%STEP(1),
id%FRERE_STEPS(1),
id%DAD_STEPS(1),
id%CANDIDATES(1,1),
2723 &
id%ISTEP_TO_INIV2(1),
id%TAB_POS_IN_PERE(1,1),
id%PTRAR(1),
2724 & ldptrar,iwk(ptrist),
id%PTLUST_S(1),
id%PTRFAC(1),iwk(ptrwb),iwk8,
2725 & iwk(itloc),rhs_mumps(1),iwk(ipool),lpool,cntl1,icntl(1),
2726 &
id%INFO(1), rinfo(1),keep(1),
id%KEEP8(1),
id%PROCNODE_STEPS(1),
2727 &
id%NSLAVES,
id%COMM_NODES,
id%MYID,
id%MYID_NODES,bufr,cmumps_lbufr
2728 & , cmumps_lbufr_bytes, cmumps_lbuf,
id%INTARR(1),
id%DBLARR(1),
2729 &
id%root, nelt_arg,
id%FRTPTR(1),
id%FRTELT(1),
id%COMM_LOAD,
2730 &
id%ASS_IRECV, seuil, seuil_ldlt_niv2,
id%MEM_DIST(0),
2731 &
id%DKEEP(1),
id%PIVNUL_LIST(1), lpn_list,
id%LRGROUPS(1)
2732 & ,
id%IPOOL_B_L0_OMP(1),
id%LPOOL_B_L0_OMP,
2733 &
id%IPOOL_A_L0_OMP(1),
id%LPOOL_A_L0_OMP,
id%L_VIRT_L0_OMP,
2734 &
id%VIRT_L0_OMP(1),
id%VIRT_L0_OMP_MAPPING(1),
id%L_PHYS_L0_OMP,
2735 &
id%PHYS_L0_OMP(1),
id%PERM_L0_OMP(1),
id%PTR_LEAFS_L0_OMP(1),
2736 &
id%L0_OMP_MAPPING(1),
id%LL0_OMP_MAPPING,
2737 &
id%THREAD_LA,
id%L0_OMP_FACTORS(1),
id%LL0_OMP_FACTORS,
2738 &
id%I4_L0_OMP(1,1),
size(
id%I4_L0_OMP,1),
size(
id%I4_L0_OMP,2),
2739 &
id%I8_L0_OMP(1,1),
size(
id%I8_L0_OMP,1),
size(
id%I8_L0_OMP,2)
2740 & )
2741 id%IS => s_is_pointers%IW;
NULLIFY(s_is_pointers%IW)
2742 id%S => s_is_pointers%A ;
NULLIFY(s_is_pointers%A)
2743
2744
2745
2746
2747 DEALLOCATE( iwk )
2748 DEALLOCATE( iwk8 )
2749 ENDIF
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759 IF ( keep(55) .eq. 0 ) THEN
2760
2761
2762
2763
2764 IF (
associated(
id%DBLARR))
THEN
2765 DEALLOCATE(
id%DBLARR)
2767 ENDIF
2768
2769 ELSE
2770
2771
2772
2773
2774 IF (
associated(
id%INTARR))
THEN
2775 DEALLOCATE(
id%INTARR)
2776 NULLIFY(
id%INTARR )
2777 ENDIF
2778
2779
2780
2781
2782
2783 IF (
id%MYID_NODES .eq. master
2784 & .AND. keep(46) .eq. 1
2785 & .AND. keep(52) .eq. 0 ) THEN
2786 NULLIFY(
id%DBLARR )
2787 ELSE
2788 IF (
associated(
id%DBLARR))
THEN
2789 DEALLOCATE(
id%DBLARR)
2791 ENDIF
2792 END IF
2793 END IF
2794
2795
2796
2797
2798
2799
2800
2801
2802 IF ( keep(19) .NE. 0 ) THEN
2803 IF ( keep(46) .NE. 1 ) THEN
2804
2805
2806 IF (
id%MYID .eq. master )
THEN
2807 CALL mpi_recv( keep(17), 1, mpi_integer, 1, defic_tag,
2808 &
id%COMM, status, ierr )
2809 CALL mpi_recv( keep(143), 1, mpi_integer, 1, defic_tag,
2810 &
id%COMM, status, ierr )
2811 ELSE IF (
id%MYID .EQ. 1 )
THEN
2812 CALL mpi_send( keep(17), 1, mpi_integer, 0, defic_tag,
2814 CALL mpi_send( keep(143), 1, mpi_integer, 0, defic_tag,
2816 END IF
2817 END IF
2818 END IF
2819
2820
2821
2822
2823
2824 IF (allocated(bufr)) DEALLOCATE(bufr)
2826
2827 IF (keep(219).NE.0) THEN
2829 ENDIF
2830
2831
2832
2833
2834
2836 &
id%COMM,
id%MYID )
2837
2839 IF (keep(201) .GT. 0) THEN
2840 IF ((keep(201).EQ.1) .OR. (keep(201).EQ.2)) THEN
2841 IF ( i_am_slave ) THEN
2843 IF(ierr.LT.0)THEN
2846 ENDIF
2847 ENDIF
2849 &
id%COMM,
id%MYID )
2850
2851
2852
2853
2854 END IF
2855 END IF
2856 IF (
id%MYID.EQ.master)
THEN
2858 id%DKEEP(94)=real(time)
2859 IF (keep(400).GT.0) THEN
2860
2861 id%DKEEP(96)=
id%DKEEP(94)-
id%DKEEP(95)
2862 ENDIF
2863 ENDIF
2864
2865
2866
2867 mem_eff_allocated = .true.
2869 &
id%MYID, n,
id%NELT,
id%NA(1),
id%LNA,
id%KEEP8(28),
2871 &
id%NSLAVES, total_mbytes, .true.,
id%KEEP(201),
2872 & blr_strat, .true., total_bytes,
2873 & idummy, bdummy, mem_eff_allocated
2874 & , .false.
2875 & ,
id%I8_L0_OMP(1,1),
size(
id%I8_L0_OMP,1),
2876 &
size(
id%I8_L0_OMP,2)
2877 & )
2878 IF (keep(400) .GT. 0 ) THEN
2880 &
id%MYID, n,
id%NELT,
id%NA(1),
id%LNA,
id%KEEP8(28),
2882 &
id%NSLAVES, total_mbytes_under_l0, .true.,
id%KEEP(201),
2883 & blr_strat, .true., total_bytes_under_l0,
2884 & idummy, bdummy, mem_eff_allocated
2885 & , .true.
2886 & ,
id%I8_L0_OMP(1,1),
size(
id%I8_L0_OMP,1),
2887 &
size(
id%I8_L0_OMP,2)
2888 & )
2889 total_mbytes =
max(total_mbytes,total_mbytes_under_l0)
2890 total_bytes =
max(total_bytes, total_bytes_under_l0)
2891 ENDIF
2892 IF (
id%KEEP8(24).NE.0)
THEN
2893
2894
2895 id%INFO(16) = total_mbytes
2896 ELSE
2897
2898
2899
2900 id%INFO(16) = total_mbytes
2901 ENDIF
2902
2903
2904
2905
2906
2907
2908
2910 &
id%INFO(16),
id%INFOG(18), irank )
2912 & mp, mpg,
id%INFO(16),
id%INFOG(18),
id%INFOG(19),
2913 &
id%NSLAVES, irank,
2915
2916 IF (prok ) THEN
2917 WRITE(mp,'(A,I12) ')
2918 & ' ** Eff. min. Space MBYTES for facto (INFO(16)):',
2919 & total_mbytes
2920 ENDIF
2921
2922
2923
2924
2925 perlu_on = .true.
2926 mem_eff_allocated = .false.
2928 &
id%MYID, n,
id%NELT,
id%NA(1),
id%LNA,
id%KEEP8(28),
2930 &
id%NSLAVES, total_mbytes, .true.,
id%KEEP(201),
2931 & blr_strat, perlu_on, total_bytes,
2932 & idummy, bdummy, mem_eff_allocated
2933 & , .false.
2934 & ,
id%I8_L0_OMP(1,1),
size(
id%I8_L0_OMP,1),
2935 &
size(
id%I8_L0_OMP,2)
2936 & )
2937 IF (keep(400) .GT. 0 ) THEN
2939 &
id%MYID, n,
id%NELT,
id%NA(1),
id%LNA,
id%KEEP8(28),
2941 &
id%NSLAVES, total_mbytes_under_l0, .true.,
id%KEEP(201),
2942 & blr_strat, perlu_on, total_bytes_under_l0,
2943 & idummy, bdummy, mem_eff_allocated
2944 & , .true.
2945 & ,
id%I8_L0_OMP(1,1),
size(
id%I8_L0_OMP,1),
2946 &
size(
id%I8_L0_OMP,2)
2947 & )
2948 total_mbytes =
max(total_mbytes,total_mbytes_under_l0)
2949 total_bytes =
max(total_bytes, total_bytes_under_l0)
2950 ENDIF
2951
2952
2953
2954 id%KEEP8(7) = total_bytes
2955
2956
2957 id%INFO(22) = total_mbytes
2958
2959
2960
2961
2962
2963
2964
2966 &
id%INFO(22),
id%INFOG(21), irank )
2967 IF ( prokg ) THEN
2968 IF (print_maxavg) THEN
2969 WRITE( mpg,'(A,I12) ')
2970 & ' ** Memory effectively used, max in Mbytes (INFOG(21)):',
2972 ENDIF
2973 WRITE( mpg,'(A,I12) ')
2974 & ' ** Memory effectively used, total in Mbytes (INFOG(22)):',
2976 END IF
2977 sum_info22_this_node=0
2979 & mpi_integer,
2980 & mpi_sum, 0,
id%KEEP(411), ierr )
2981 CALL mpi_reduce( sum_info22_this_node, max_sum_info22_this_node,
2982 & 1, mpi_integer, mpi_max, 0,
id%COMM, ierr )
2983 IF (prokg .AND. print_nodeinfo) THEN
2984 WRITE(mpg,'(A,I12)')
2985 & ' ** Max. effective space per compute node, in MBytes :',
2986 & max_sum_info22_this_node
2987 ENDIF
2988
2989 IF (i_am_slave) THEN
2995 ELSE
2996 k67 = 0_8
2997 k68 = 0_8
2998 k70 = 0_8
2999 k74 = 0_8
3000 k75 = 0_8
3001 ENDIF
3002
3003
3005
3006
3007 IF (keep(400) .GT.0 ) THEN
3008 IF (.NOT. i_am_slave) THEN
3009 id%DKEEP(95) = 0.0e0
3010 id%DKEEP(16) = 0.0e0
3011 ENDIF
3012 IF (
id%NPROCS .GT. 1)
THEN
3013
3015 & mpi_real, mpi_sum, master,
id%COMM, ierr)
3016 IF (
id%MYID.EQ.master) timeavg=dble(tmptime)
3018 & mpi_real, mpi_sum, master,
id%COMM, ierr)
3019 IF (
id%MYID.EQ.master) flopavg=dble(tmpflop)
3020 IF (
id%MYID.EQ.master)
THEN
3021 timeavg = timeavg /
id%NSLAVES
3022 flopavg = flopavg /
id%NSLAVES
3023 ENDIF
3025 & mpi_real, mpi_max, master,
id%COMM, ierr)
3026 IF (
id%MYID.EQ.master) timemax=dble(tmptime)
3028 & mpi_real, mpi_max, master,
id%COMM, ierr)
3029 IF (
id%MYID.EQ.master) flopmax=dble(tmpflop)
3030
3031 IF ( prokg ) THEN
3032 WRITE(mpg,190) flopavg, flopmax
3033 WRITE(mpg,188) timeavg, timemax
3034 ENDIF
3035 ELSE
3036
3037 IF ( prokg ) THEN
3038 WRITE(mpg,189)
id%DKEEP(16)
3039 WRITE(mpg,187)
id%DKEEP(95)
3040 ENDIF
3041 ENDIF
3042 ENDIF
3043 IF ( prokg ) THEN
3044 IF (
id%INFO(1) .GE.0)
THEN
3045 WRITE(mpg,180)
id%DKEEP(94)
3046 ELSE
3047 WRITE(mpg,185)
id%DKEEP(94)
3048 ENDIF
3049 ENDIF
3050
3051
3052
3053
3054 rinfo(4) = rinfo(3)
3055
3056
3057
3059 & mpi_real,
3060 & mpi_sum, master,
id%COMM, ierr)
3061
3062
3063 keep(247) = 0
3064 CALL mpi_reduce( keep(246), keep(247), 1, mpi_integer,
3065 & mpi_max, master,
id%COMM, ierr)
3066
3067
3069 & mpi_real,
3070 & mpi_max, master,
id%COMM, ierr)
3071
3073 & mpi_real,
3074 & mpi_sum, master,
id%COMM, ierr)
3076 & mpi_sum, master,
id%COMM )
3077
3078 IF (
id%MYID.EQ.0)
THEN
3079
3080 rinfog(16) = real(
id%KEEP8(6)*int(keep(35),8))/real(1e6)
3081 IF (keep(201).LE.0) THEN
3082 rinfog(16) = zero
3083 ENDIF
3084 ENDIF
3088
3090 & 1, mpi_integer8,
3091 & mpi_sum, master,
id%COMM, ierr)
3092 IF (
id%MYID.EQ.master)
THEN
3094 ENDIF
3095
3097 & mpi_max,
id%COMM, ierr)
3098
3099
3100
3101 keep(133) = infog(11)
3102 CALL mpi_reduce(
id%INFO(12), infog(12), 3, mpi_integer,
3103 & mpi_sum, master,
id%COMM, ierr)
3104 CALL mpi_reduce( keep(103), infog(25), 1, mpi_integer,
3105 & mpi_sum, master,
id%COMM, ierr)
3106 keep(229) = infog(25)
3107 CALL mpi_reduce( keep(105), infog(25), 1, mpi_integer,
3108 & mpi_sum, master,
id%COMM, ierr)
3109 keep(230) = infog(25)
3110
3111 id%INFO(25) = keep(98)
3113 & mpi_sum,
id%COMM, ierr)
3114
3117
3122
3123 id%INFO(28) =
id%INFO(27)
3124 infog(35) = infog(29)
3125
3126
3127
3128 IF ( keep(486) .NE. 0 ) THEN
3129
3132
3133
3134
3137
3139 & , 1, mpi_double_precision,
3140 & mpi_sum, master,
id%COMM, ierr)
3142 & , 1, mpi_double_precision,
3143 & mpi_sum, master,
id%COMM, ierr)
3145 & , 1, mpi_double_precision,
3146 & mpi_sum, master,
id%COMM, ierr)
3148 & , 1, mpi_double_precision,
3149 & mpi_sum, master,
id%COMM, ierr)
3151 & , 1, mpi_double_precision,
3152 & mpi_sum, master,
id%COMM, ierr)
3154 & , 1, mpi_double_precision,
3155 & mpi_sum, master,
id%COMM, ierr)
3157 & , 1, mpi_double_precision,
3158 & mpi_sum, master,
id%COMM, ierr)
3160 & , 1, mpi_double_precision,
3161 & mpi_sum, master,
id%COMM, ierr)
3163 & , 1, mpi_double_precision,
3164 & mpi_sum, master,
id%COMM, ierr)
3166 & tmp_flop_frswap_compress
3167 & , 1, mpi_double_precision,
3168 & mpi_sum, master,
id%COMM, ierr)
3170 & tmp_flop_midblk_compress
3171 & , 1, mpi_double_precision,
3172 & mpi_sum, master,
id%COMM, ierr)
3174 & , 1, mpi_double_precision,
3175 & mpi_sum, master,
id%COMM, ierr)
3177 & , 1, mpi_double_precision,
3178 & mpi_sum, master,
id%COMM, ierr)
3180 & , 1, mpi_double_precision,
3181 & mpi_sum, master,
id%COMM, ierr)
3183 & , 1, mpi_double_precision,
3184 & mpi_sum, master,
id%COMM, ierr)
3186 & , 1, mpi_double_precision,
3187 & mpi_sum, master,
id%COMM, ierr)
3189 & , 1, mpi_double_precision,
3190 & mpi_sum, master,
id%COMM, ierr)
3192 & , 1, mpi_double_precision,
3193 & mpi_sum, master,
id%COMM, ierr)
3195 & , 1, mpi_double_precision,
3196 & mpi_sum, master,
id%COMM, ierr)
3198 & , 1, mpi_double_precision,
3199 & mpi_sum, master,
id%COMM, ierr)
3201 & , 1, mpi_double_precision,
3202 & mpi_sum, master,
id%COMM, ierr)
3204 & , 1, mpi_integer,
3205 & mpi_sum, master,
id%COMM, ierr)
3206 IF (
id%NPROCS.GT.1)
THEN
3210 & , 1, mpi_double_precision,
3211 & mpi_sum, master,
id%COMM, ierr)
3212 IF (
id%MYID.EQ.master)
THEN
3214 ENDIF
3216 & , 1, mpi_double_precision,
3217 & mpi_min, master,
id%COMM, ierr)
3219 & , 1, mpi_double_precision,
3220 & mpi_max, master,
id%COMM, ierr)
3221 ENDIF
3223 & , 1, mpi_double_precision,
3224 & mpi_sum, master,
id%COMM, ierr)
3226 & , 1, mpi_double_precision,
3227 & mpi_sum, master,
id%COMM, ierr)
3229 & , 1, mpi_double_precision,
3230 & mpi_sum, master,
id%COMM, ierr)
3232 & , 1, mpi_double_precision,
3233 & mpi_sum, master,
id%COMM, ierr)
3235 & , 1, mpi_double_precision,
3236 & mpi_sum, master,
id%COMM, ierr)
3238 & , 1, mpi_double_precision,
3239 & mpi_sum, master,
id%COMM, ierr)
3241 & , 1, mpi_double_precision,
3242 & mpi_sum, master,
id%COMM, ierr)
3244 & , 1, mpi_double_precision,
3245 & mpi_sum, master,
id%COMM, ierr)
3247 & tmp_time_midblk_compress
3248 & , 1, mpi_double_precision,
3249 & mpi_sum, master,
id%COMM, ierr)
3251 & tmp_time_frswap_compress
3252 & , 1, mpi_double_precision,
3253 & mpi_sum, master,
id%COMM, ierr)
3255 & , 1, mpi_double_precision,
3256 & mpi_sum, master,
id%COMM, ierr)
3258 & , 1, mpi_double_precision,
3259 & mpi_sum, master,
id%COMM, ierr)
3261 & , 1, mpi_double_precision,
3262 & mpi_sum, master,
id%COMM, ierr)
3264 & , 1, mpi_double_precision,
3265 & mpi_sum, master,
id%COMM, ierr)
3267 & , 1, mpi_double_precision,
3268 & mpi_sum, master,
id%COMM, ierr)
3270 & , 1, mpi_double_precision,
3271 & mpi_sum, master,
id%COMM, ierr)
3273 & , 1, mpi_double_precision,
3274 & mpi_sum, master,
id%COMM, ierr)
3276 & , 1, mpi_double_precision,
3277 & mpi_sum, master,
id%COMM, ierr)
3279 & , 1, mpi_double_precision,
3280 & mpi_sum, master,
id%COMM, ierr)
3282 & , 1, mpi_double_precision,
3283 & mpi_sum, master,
id%COMM, ierr)
3285 & , 1, mpi_double_precision,
3286 & mpi_sum, master,
id%COMM, ierr)
3288 & , 1, mpi_double_precision,
3289 & mpi_sum, master,
id%COMM, ierr)
3291 & , 1, mpi_double_precision,
3292 & mpi_sum, master,
id%COMM, ierr)
3294 & , 1, mpi_double_precision,
3295 & mpi_sum, master,
id%COMM, ierr)
3297 & , 1, mpi_double_precision,
3298 & mpi_sum, master,
id%COMM, ierr)
3300 & , 1, mpi_double_precision,
3301 & mpi_sum, master,
id%COMM, ierr)
3302 IF (
id%MYID.EQ.master)
THEN
3303 IF (
id%NPROCS.GT.1)
THEN
3304
3305
3354 ENDIF
3357
3358
3359
3360
3362 frontwise = 0
3363
3364 IF (lpok) THEN
3365 IF (cntl(7) < 0.0e0) THEN
3366
3367
3368 WRITE(lp,'(/A/,A/,A/,A,A)')
3369 & ' WARNING in BLR input setting',
3370 & ' CNTL(7) < 0 is experimental: ',
3371 & ' RRQR precision = |CNTL(7| x ||A_pre||, ',
3372 & ' where A_pre is the preprocessed matrix as defined',
3373 & ' in the Users guide '
3374 ENDIF
3375 ENDIF
3377 & keep(489),
id%DKEEP, n,
id%ICNTL(36),
3378 & keep(487), keep(488), keep(490),
3379 & keep(491), keep(50), keep(486),
3380 & keep(472), keep(475), keep(478), keep(480),
3381 & keep(481),
3382 & keep(483), keep(484),
3383 &
id%KEEP8(110),
id%KEEP8(49),
3384 & keep(28),
id%NPROCS, mpg, prokg)
3385
3386 rinfog(14) =
id%DKEEP(56)
3387 ELSE
3388 rinfog(14) = 0.0e00
3389 ENDIF
3390 ENDIF
3391
3392
3393
3394 IF(keep(110) .EQ. 1) THEN
3395
3396
3397 id%INFO(18) = keep(109)
3399 & mpi_sum,
id%COMM, ierr)
3400 ELSE
3402 keep(109) = 0
3403 keep(112) = 0
3404 ENDIF
3405 IF (
id%MYID.EQ.master)
THEN
3406
3407 infog(28)=keep(112)+keep(17)
3408 ENDIF
3409
3410
3411
3412
3413
3414
3415
3416 IF (keep(17) .NE. 0) THEN
3417 IF (
id%MYID .EQ. id_root)
THEN
3418
3419
3420
3421 id%INFO(18)=
id%INFO(18)+keep(17)
3422 ENDIF
3423 IF (id_root .EQ. master) THEN
3424 IF (
id%MYID.EQ.master)
THEN
3425
3426
3427
3428
3429
3430
3431
3432
3433 DO i= keep(17), 1, -1
3434
3435
3436 id%PIVNUL_LIST(keep(112)+i)=
id%PIVNUL_LIST(keep(109)+i)
3437 ENDDO
3438 ENDIF
3439 ELSE
3440
3441
3442
3443
3444
3445 IF (
id%MYID .EQ. id_root)
THEN
3446 CALL mpi_send(
id%PIVNUL_LIST(keep(109)+1), keep(17),
3447 & mpi_integer, master, zero_piv,
3449 ELSE IF (
id%MYID .EQ. master)
THEN
3450 CALL mpi_recv(
id%PIVNUL_LIST(keep(112)+1), keep(17),
3451 & mpi_integer, id_root, zero_piv,
3452 &
id%COMM, status, ierr )
3453 ENDIF
3454 ENDIF
3455 ENDIF
3456
3457
3458
3459
3460
3461
3462
3463 IF(keep(110) .EQ. 1) THEN
3464 ALLOCATE(itmp2(
id%NPROCS),stat = ierr )
3465 IF ( ierr .GT. 0 ) THEN
3467 id%INFO(2)=
id%NPROCS
3468 END IF
3470 &
id%COMM,
id%MYID )
3471 IF (
id%INFO(1).LT.0)
GOTO 490
3473 & itmp2(1), 1, mpi_integer,
3474 & master,
id%COMM, ierr)
3475 IF(
id%MYID .EQ. master)
THEN
3476 posbuf = itmp2(1)+1
3477
3478
3479 keep(220)=1
3480 DO i = 1,
id%NPROCS-1
3481 CALL mpi_recv(
id%PIVNUL_LIST(posbuf), itmp2(i+1),
3482 & mpi_integer,i,
3483 & zero_piv,
id%COMM, status, ierr)
3484
3485
3486
3487
3488 CALL mpi_send(posbuf, 1, mpi_integer, i, zero_piv,
3490 posbuf = posbuf + itmp2(i+1)
3491 ENDDO
3492 ELSE
3493 CALL mpi_send(
id%PIVNUL_LIST(1), keep(109), mpi_integer,
3494 & master,zero_piv,
id%COMM, ierr)
3495 CALL mpi_recv( keep(220), 1, mpi_integer, master, zero_piv,
3496 &
id%COMM, status, ierr )
3497 ENDIF
3498 ENDIF
3499
3500
3501
3503 & mpi_real,
3504 & mpi_min, master,
id%COMM, ierr )
3506 & mpi_real,
3507 & mpi_min, master,
id%COMM, ierr )
3509 & mpi_real,
3510 & mpi_max, master,
id%COMM, ierr )
3511
3512
3513
3514 CALL mpi_reduce(
id%KEEP8(80), itemp8, 1, mpi_integer8,
3515 & mpi_sum, master,
id%COMM, ierr )
3516 IF (
id%MYID .EQ. master)
THEN
3518 ENDIF
3519
3520
3521
3523 & mpi_max, master,
id%COMM, ierr )
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536 IF (
id%MYID.EQ.master .AND. lscal. and. keep(258).NE.0)
THEN
3537 k =
min(keep(143), keep(17))
3539 DO i = 1, keep(112)+ k
3540
3542 &
id%ROWSCA(
id%PIVNUL_LIST(i)),
3543 &
id%DKEEP(6), keep(259))
3545 &
id%COLSCA(
id%PIVNUL_LIST(i)),
3546 &
id%DKEEP(6), keep(259))
3547 ENDDO
3548 ENDIF
3549
3550
3551
3552 IF (keep(258).NE.0) THEN
3553
3554 IF (keep(260).EQ.-1) THEN
3555 id%DKEEP(6)=-
id%DKEEP(6)
3556 id%DKEEP(7)=-
id%DKEEP(7)
3557 ENDIF
3558
3559
3560
3562 &
id%COMM,
id%DKEEP(6), keep(259),
3563 & rinfog(12), infog(34),
id%NPROCS)
3564
3565
3566
3567 IF (
id%KEEP(50).EQ.0 .AND.
id%MYID.EQ. master)
THEN
3568
3569
3570
3571 IF (
id%KEEP(23).NE.0)
THEN
3574
3575
3578
3579
3580
3581 ENDIF
3582 ENDIF
3583 ENDIF
3584 490 IF (allocated(itmp2)) DEALLOCATE(itmp2)
3585 IF ( prokg ) THEN
3586
3587
3588
3589 WRITE(mpg,99984) rinfog(2),rinfog(3),keep(52),
3591 &
id%KEEP8(128), infog(11),
id%KEEP8(110)
3592 IF (
id%KEEP(50) == 0)
THEN
3593
3594 WRITE(mpg, 99985) infog(12)
3595 END IF
3596 IF (
id%KEEP(50) .NE. 1)
THEN
3597
3598 WRITE(mpg, 99982) infog(13)
3599 END IF
3600 IF (keep(97) .NE. 0) THEN
3601
3602 WRITE(mpg, '(A,D16.4)')
3603 & ' Effective static pivoting thresh., CNTL(4) =', seuil
3604 WRITE(mpg, 99986) infog(25)
3605 ENDIF
3606 IF (
id%KEEP(50) == 2)
THEN
3607
3608 WRITE(mpg, 99988) keep(229)
3609
3610 WRITE(mpg, 99989) keep(230)
3611 ENDIF
3612
3613 IF (keep(110) .NE.0) THEN
3614 WRITE(mpg, 99991) keep(112)
3615 ENDIF
3616
3617 IF ( keep(19) .ne. 0 )
3618
3619 & WRITE(mpg, 99983) keep(17)
3620
3621 IF (keep(110).NE.0.OR.keep(19).NE.0)
3622
3623 & WRITE(mpg, 99992) keep(17)+keep(112)
3624
3625 WRITE(mpg, 99981) infog(14)
3626
3627
3628 IF (
id%KEEP8(108) .GT. 0_8)
THEN
3629 WRITE(mpg, 99980)
id%KEEP8(108)
3630 ENDIF
3631 IF ((keep(60).NE.0) .AND. infog(25).GT.0) THEN
3632
3633
3634 WRITE(mpg, '(A)')
3635 & " ** Warning Static pivoting was necessary"
3636 WRITE(mpg, '(A)')
3637 & " ** to factor interior variables with Schur ON"
3638 ENDIF
3639 IF (keep(258).NE.0) THEN
3640 WRITE(mpg,99978) rinfog(12)
3641 WRITE(mpg,99979) rinfog(13)
3642 WRITE(mpg,99977) infog(34)
3643 ENDIF
3644 END IF
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655#if ! defined(NO_FDM_DESCBAND)
3656
3657#endif
3658#if ! defined(NO_FDM_MAPROW)
3659
3660#endif
3661
3662
3663 500 CONTINUE
3664
3665
3666
3667 IF (
id%KEEP(46).EQ.1 .AND.
3668 &
id%KEEP(55).NE.0 .AND.
3669 &
id%MYID.EQ.master .AND.
3670 &
id%KEEP(52) .EQ. 0)
THEN
3672 ELSE
3673 IF (
associated(
id%DBLARR))
THEN
3674 DEALLOCATE(
id%DBLARR)
3676 ENDIF
3677 ENDIF
3678#if ! defined(NO_FDM_DESCBAND)
3679 IF (i_am_slave) THEN
3681 ENDIF
3682#endif
3683#if ! defined(NO_FDM_MAPROW)
3684 IF (i_am_slave) THEN
3686 ENDIF
3687#endif
3688 IF (i_am_slave) THEN
3689
3690 IF (
3691 & (
3692 & (keep(486).EQ.2)
3693 & )
3694 & .AND.
id%INFO(1).GE.0
3695 & ) THEN
3696
3697
3699 ELSE
3700
3702 ENDIF
3703 ENDIF
3704 IF (i_am_slave) THEN
3706
3707 IF (
3708 & (
3709 & (keep(486).EQ.2)
3710 & )
3711 & .AND.
id%INFO(1).GE.0
3712 & ) THEN
3715 IF (.NOT.
associated(
id%FDM_F_ENCODING))
THEN
3716 WRITE(*,*) "Internal error 2 in CMUMPS_FAC_DRIVER"
3717 ENDIF
3718 ELSE
3720 ENDIF
3721 ENDIF
3722
3723
3724
3725
3726
3727
3728 514 CONTINUE
3729 IF ( i_am_slave ) THEN
3730 IF ((keep(201).EQ.1).OR.(keep(201).EQ.2)) THEN
3732 IF (
id%ASSOCIATED_OOC_FILES)
THEN
3733 id%ASSOCIATED_OOC_FILES = .false.
3734 ENDIF
3735 IF (ierr.LT.0 .AND.
id%INFO(1) .GE. 0)
id%INFO(1) = ierr
3736 ENDIF
3737 IF (wk_user_provided) THEN
3738
3740 ELSE IF (keep(201).NE.0) THEN
3741
3742
3743
3744
3745
3746
3747
3748 IF (
associated(
id%S))
DEALLOCATE(
id%S)
3751 ENDIF
3752 ELSE
3753 IF (wk_user_provided) THEN
3754
3756 ELSE
3757 IF (
associated(
id%S))
DEALLOCATE(
id%S)
3760 END IF
3761 END IF
3762
3763
3764
3765 513 CONTINUE
3766 IF ( i_am_slave ) THEN
3768 IF (ierr.LT.0 .AND.
id%INFO(1) .GE. 0)
id%INFO(1) = ierr
3769 ENDIF
3771 &
id%COMM,
id%MYID )
3772
3773
3774
3775
3776 517 CONTINUE
3777
3778
3779
3780 530 CONTINUE
3781
3782
3783 IF (rhs_mumps_allocated) DEALLOCATE(rhs_mumps)
3784 NULLIFY(rhs_mumps)
3785
3786 id%KEEP8(26) = keep826_save
3787 RETURN
3788 120 FORMAT(/' Local redistrib: data local/sent =',i16,i16)
3789 125 FORMAT(/' Redistrib: total data local/sent =',i16,i16)
3790 130 FORMAT(//'****** FACTORIZATION STEP ********'/)
3791 160 FORMAT(
3792 & /' Elapsed time to reformat/distribute matrix =',f12.4)
3793 166 FORMAT(' Max difference from 1 after scaling the entries',
3794 & ' for ONE-NORM (option 7/8) =',d9.2)
3795 170 FORMAT(' STATISTICS PRIOR NUMERICAL FACTORIZATION ...'/
3796 & ' Size of internal working array S =',i16/
3797 & ' Size of internal working array IS =',i16/
3798 & ' Minimum (ICNTL(14)=0) size of S =',i16/
3799 & ' Minimum (ICNTL(14)=0) size of IS =',i16/
3800 & ' Real space for original matrix =',i16/
3801 & ' Integer space for original matrix =',i16/
3802 & ' INFO(3) Real space for factors (estimated) =',i16/
3803 & ' INFO(4) Integer space for factors (estim.) =',i16/
3804 & ' Maximum frontal size (estimated) =',i16)
3805 172 FORMAT(' GLOBAL STATISTICS PRIOR NUMERICAL FACTORIZATION ...'/
3806 & ' Number of working processes =',i16/
3807 & ' ICNTL(22) Out-of-core option =',i16/
3808 & ' ICNTL(35) BLR activation (eff. choice) =',i16/
3809 & ' ICNTL(14) Memory relaxation =',i16/
3810 & ' INFOG(3) Real space for factors (estimated)=',i16/
3811 & ' INFOG(4) Integer space for factors (estim.)=',i16/
3812 & ' Maximum frontal size (estimated) =',i16/
3813 & ' Number of nodes in the tree =',i16/
3814 & ' ICNTL(23) Memory allowed (value on host) =',i16/
3815 & ' Sum over all procs =',i16/
3816 & ' Memory provided by user, sum of LWK_USER =',i16/
3817 & ' Effective threshold for pivoting, CNTL(1) =',d16.4)
3818 173 FORMAT( ' Perform forward during facto, NRHS =',i16)
3819 174 FORMAT( ' KEEP(268) Relaxed pivoting effective value =',i16)
3820 180 FORMAT(/' Elapsed time for factorization =',f12.4)
3821 185 FORMAT(/' Elapsed time for (failed) factorization =',f12.4)
3822 187 FORMAT( ' Elapsed time under L0 =',f12.4)
3823 188 FORMAT( ' Elapsed time under L0 (avg/max across MPI) =',
3824 & f12.4,f12.4)
3825 189 FORMAT(/' Flops under L0 layer =',1pd12.3)
3826 190 FORMAT(/' Flops under L0 Layer (avg/max across MPI) =',
3827 & 1pd12.3,1pd12.3)
382899977 FORMAT( ' INFOG(34) Determinant (base 2 exponent) =',i16)
382999978 FORMAT( ' RINFOG(12) Determinant (real part) =',f16.8)
383099979 FORMAT( ' RINFOG(12) Determinant (imaginary part) =',f16.8)
383199980 FORMAT( ' Extra copies due to In-Place stacking =',i16)
383299981 FORMAT( ' INFOG(14) Number of memory compress =',i16)
383399982 FORMAT( ' INFOG(13) Number of delayed pivots =',i16)
383499983 FORMAT( ' Nb of singularities detected by ICNTL(56) =',i16)
383599991 FORMAT( ' Nb of null pivots detected by ICNTL(24) =',i16)
383699992 FORMAT( ' INFOG(28) Estimated deficiency =',i16)
383799984 FORMAT(/'Leaving factorization with ...'/
3838 & ' RINFOG(2) Operations in node assembly =',1pd10.3/
3839 & ' ------(3) Operations in node elimination =',1pd10.3/
3840 & ' ICNTL (8) Scaling effectively used =',i16/
3841 & ' INFOG (9) Real space for factors =',i16/
3842 & ' infog(10) Integer space for factors =',I16/
3843 & ' infog(11) maximum front size =',I16/
3844 & ' infog(29) number of entries in factors =',I16)
384599985 FORMAT( ' infog(12) number of off diagonal pivots =',I16)
384699986 FORMAT( ' infog(25) number of tiny pivots(
static) =
',I16)
384799988 FORMAT( ' number of 2x2 pivots in type 1 nodes =',I16)
384899989 FORMAT( ' number of 2x2 pivots in type 2 nodes =',I16)
subroutine mumps_propinfo(icntl, info, comm, id)
subroutine cmumps_facto_send_arrowheads(n, nz, aspk, irn, icn, perm, lscal, colsca, rowsca, myid, slavef, procnode_steps, nbrecords, lp, comm, root, keep, keep8, fils, rg2l, intarr, lintarr, dblarr, ldblarr, ptraiw, ptrarw, frere_steps, step, a, la, istep_to_iniv2, i_am_cand, candidates)
subroutine cmumps_facto_recv_arrowhd2(n, dblarr, ldblarr, intarr, lintarr, ptraiw, ptrarw, keep, keep8, myid, comm, nbrecords, a, la, root, procnode_steps, slavef, perm, frere_steps, step, info1, info2)
subroutine cmumps_free_id_data_modules(id_fdm_f_encoding, id_blrarray_encoding, keep8, k34)
subroutine cmumps_fac_b(n, s_is_pointers, la, liw, sym_perm, na, lna, ne_steps, nfsiz, fils, step, frere, dad, cand, istep_to_iniv2, tab_pos_in_pere, ptrar, ldptrar, ptrist, ptlust_s, ptrfac, iw1, iw2, itloc, rhs_mumps, pool, lpool, cntl1, icntl, info, rinfo, keep, keep8, procnode_steps, slavef, comm_nodes, myid, myid_nodes, bufr, lbufr, lbufr_bytes, cmumps_lbuf, intarr, dblarr, root, nelt, frtptr, frtelt, comm_load, ass_irecv, seuil, seuil_ldlt_niv2, mem_distrib, dkeep, pivnul_list, lpn_list, lrgroups, ipool_b_l0_omp, lpool_b_l0_omp, ipool_a_l0_omp, lpool_a_l0_omp, l_virt_l0_omp, virt_l0_omp, virt_l0_omp_mapping, l_phys_l0_omp, phys_l0_omp, perm_l0_omp, ptr_leafs_l0_omp, l0_omp_mapping, ll0_omp_mapping, thread_la, l0_omp_factors, ll0_omp_factors, i4_l0_omp, nbstats_i4, nbcols_i4, i8_l0_omp, nbstats_i8, nbcols_i8)
subroutine cmumps_deter_square(deter, nexp)
subroutine cmumps_deter_reduction(comm, deter_in, nexp_in, deter_out, nexp_out, nprocs)
subroutine cmumps_updatedeter_scaling(piv, deter, nexp)
subroutine cmumps_deter_sign_perm(deter, n, visited, perm)
subroutine cmumps_deter_scaling_inverse(deter, nexp)
subroutine cmumps_elt_distrib(n, nelt, na_elt8, comm, myid, slavef, ielptr_loc8, relptr_loc8, eltvar_loc, eltval_loc, lintarr, ldblarr, keep, keep8, maxelt_size, frtptr, frtelt, a, la, fils, id, root)
subroutine cmumps_maxelt_size(eltptr, nelt, maxelt_size)
subroutine cmumps_redistribution(n, nz_loc8, id, dblarr, ldblarr, intarr, lintarr, ptraiw, ptrarw, keep, keep8, myid, comm, nbrecords a, la, root, procnode_steps, slavef, perm, step, icntl, info, nsend8, nlocal8, istep_to_iniv2, candidates)
subroutine cmumps_avgmax_stat8(prokg, mpg, val, nslaves, print_maxavg, comm, msg)
subroutine cmumps_print_allocated_mem(prok, prokg, print_maxavg, mp, mpg, info16, infog18, infog19, nslaves, irank, keep)
subroutine cmumps_extract_schur_redrhs(id)
subroutine cmumps_fac_a(n, nz8, nsca, aspk, irn, icn, colsca, rowsca, wk, lwk8, wk_real, lwk_real, icntl, info)
subroutine cmumps_anorminf(id, anorminf, lscal, eff_size_schur)
subroutine cmumps_simscaleabs(irn_loc, jcn_loc, a_loc, nz_loc, m, n, numprocs, myid, comm, rpartvec, cpartvec, rsndrcvsz, csndrcvsz, registre, iwrk, iwrksz, intsz, resz, op, rowsca, colsca, wrkrc, iszwrkrc, sym, nb1, nb2, nb3, eps, onenormerr, infnormerr)
subroutine cmumps_init_root_fac(n, root, fils, iroot, keep, info)
subroutine mpi_comm_split(comm, color, key, comm2, ierr)
subroutine mpi_allreduce(sendbuf, recvbuf, cnt, datatype, operation, comm, ierr)
subroutine mpi_comm_size(comm, size, ierr)
subroutine mpi_bcast(buffer, cnt, datatype, root, comm, ierr)
subroutine mpi_gather(sendbuf, cnt, datatype, recvbuf, reccnt, rectype, root, comm, ierr)
subroutine mpi_comm_free(comm, ierr)
subroutine mpi_comm_rank(comm, rank, ierr)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine, public cmumps_buf_deall_small_buf(ierr)
subroutine, public cmumps_buf_dist_irecv_size(cmumps_lbufr_bytes)
subroutine, public cmumps_buf_ini_myid(myid)
subroutine, public cmumps_buf_deall_max_array()
subroutine, public cmumps_buf_max_array_minsize(nfs4father, ierr)
subroutine, public cmumps_buf_alloc_small_buf(size, ierr)
subroutine, public cmumps_init_l0_omp_factors(id_l0_omp_factors)
subroutine, public cmumps_free_l0_omp_factors(id_l0_omp_factors)
subroutine, public cmumps_load_end(info1, nslaves, ierr)
subroutine, public cmumps_load_set_inicost(cost_subtree_arg, k64, dk15, k375, maxs)
subroutine, public cmumps_load_init(id, memory_md_arg, maxs)
subroutine, public cmumps_load_update(check_flops, process_bande, inc_load, keep, keep8)
subroutine, public cmumps_blr_end_module(info1, keep8, k34, lrsolve_act_opt)
subroutine, public cmumps_blr_mod_to_struc(id_blrarray_encoding)
subroutine, public cmumps_blr_init_module(initial_size, info)
double precision flop_accum_compress
double precision flop_update_fr
double precision time_cb_compress
double precision flop_facto_lr
double precision time_update_frlr
double precision flop_midblk_compress
double precision time_compress
double precision time_decomp_locasm2
double precision flop_decompress
double precision time_decomp
double precision time_frfronts
double precision avg_flop_facto_lr
double precision time_decomp_ucfs
double precision flop_trsm
double precision max_flop_facto_lr
double precision flop_panel
double precision flop_update_lr
double precision time_update
double precision mry_cb_lrgain
double precision flop_frswap_compress
double precision time_update_frfr
double precision flop_cb_compress
double precision time_frswap_compress
double precision time_decomp_asm1
double precision flop_trsm_lr
double precision flop_trsm_fr
double precision time_decomp_asms2m
double precision time_update_lrlr1
double precision mry_lu_lrgain
double precision time_midblk_compress
double precision time_lr_module
subroutine saveandwrite_gains(local, k489, dkeep, n, icntl36, depth, bcksz, nassmin, nfrontmin, sym, k486, k472, k475, k478, k480, k481, k483, k484, k8110, k849, nbtreenodes, nprocs, mpg, prokg)
double precision flop_frfronts
double precision time_fac_sq
double precision time_fac_mq
double precision min_flop_facto_lr
double precision mry_cb_fr
double precision time_decomp_maplig1
double precision flop_lrgain
double precision time_lrtrsm
double precision flop_update_lrlr3
double precision time_diagcopy
double precision time_fac_i
double precision flop_compress
double precision time_panel
subroutine compute_global_gains(nb_entries_factor, flop_number, nb_entries_factor_withlr, prokg, mpg)
double precision time_update_lrlr2
double precision time_update_lrlr3
subroutine init_stats_global(id)
double precision flop_facto_fr
double precision mry_lu_fr
double precision time_frtrsm
double precision flop_cb_decompress
double precision time_decomp_asms2s
subroutine cmumps_clean_ooc_data(id, ierr)
subroutine cmumps_ooc_end_facto(id, ierr)
subroutine, public cmumps_ooc_init_facto(id, maxs)
subroutine cmumps_ooc_clean_pending(ierr)
subroutine, public mumps_fdbd_init(initial_size, info)
subroutine, public mumps_fdbd_end(info1)
subroutine, public mumps_fmrd_init(initial_size, info)
subroutine, public mumps_fmrd_end(info1)
subroutine, public mumps_fdm_mod_to_struc(what, id_fdm_encoding, info)
subroutine, public mumps_fdm_init(what, initial_size, info)
subroutine, public mumps_fdm_end(what)
subroutine static(v, vr, a, ar, ms, in, igrnod, weight_md, wfext)