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 (ZMUMPS_STRUC), TARGET :: id
49 DOUBLE PRECISION, 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(ZMUMPS_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 DOUBLE PRECISION :: 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 :: ZMUMPS_LBUFR, ZMUMPS_LBUFR_BYTES
103 INTEGER(8) :: ZMUMPS_LBUFR_BYTES8
104 INTEGER, ALLOCATABLE, DIMENSION(:) :: BUFR
105
106 INTEGER :: ZMUMPS_LBUF, ZMUMPS_LBUF_INT
107 INTEGER(8) :: ZMUMPS_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 DOUBLE PRECISION CNTL4, AVG_FLOPS
117 INTEGER MIN_PERLU, MAXIS_ESTIM
118 INTEGER 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(kind=8), TARGET :: S_DUMMY_ARG(1)
126 COMPLEX(kind=8), POINTER, DIMENSION(:) :: S_PTR_ARG
127 INTEGER NB_THREADS, NOMP
128 DOUBLE PRECISION TIMEAVG, TIMEMAX,
129 & flopavg, flopmax
130 DOUBLE PRECISION TMPTIME, TMPFLOP
131 INTEGER NPIV_CRITICAL_PATH, EFF_SIZE_SCHUR
132 DOUBLE PRECISION TIME, TIMEET
133 DOUBLE PRECISION ZERO, ONE, MONE
134 parameter( zero = 0.0d0, one = 1.0d0, mone = -1.0d0)
135 COMPLEX(kind=8) CZERO
136 parameter( czero = (0.0d0, 0.0d0) )
137 INTEGER PERLU, TOTAL_MBYTES, K231, K232, K233, BLR_STRAT
138 INTEGER, PARAMETER :: IDUMMY = -9999
139 LOGICAL, PARAMETER :: BDUMMY =.false.
140 INTEGER, PARAMETER :: PANEL_TABSIZE = 20
141 INTEGER COLOUR, COMM_FOR_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 DOUBLE PRECISION :: ANORMINF, SEUIL, SEUIL_LDLT_NIV2, Thresh_Seuil
149 DOUBLE PRECISION :: CNTL1, CNTL3, , 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 :: TMP_FLOP_TRSM
163 DOUBLE PRECISION :: TMP_FLOP_PANEL
164 DOUBLE PRECISION :: TMP_FLOP_FRFRONTS
165 DOUBLE PRECISION ::
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(kind=8), DIMENSION(:), ALLOCATABLE :: WK
210 DOUBLE PRECISION, 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 DOUBLE PRECISION SCONEERR, SCINFERR
220
221
222
223
224 INTEGER, POINTER :: JOB
225
226 DOUBLE PRECISION,DIMENSION(:),POINTER::RINFO, RINFOG
227 DOUBLE PRECISION,DIMENSION(:),POINTER:: CNTL
228 INTEGER,DIMENSION(:),POINTER:: INFOG, KEEP
229 INTEGER, DIMENSION(:), POINTER :: MYIRN_loc, MYJCN_loc
230 COMPLEX(kind=8), DIMENSION(:), POINTER :: MYA_loc
231 INTEGER, TARGET :: DUMMYIRN_loc(1), DUMMYJCN_loc(1)
232 COMPLEX(kind=8), 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 ::
246 INTEGER(8):: TOTAL_BYTES_UNDER_L0
247
248 COMPLEX(kind=8), 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.0d0)
284 id%DKEEP(20)=huge(0.0d0)
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.0D0'
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.5d0) THEN
496 cntl1 = 0.5d0
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
524 CALL mpi_bcast(cntl1, 1, mpi_double_precision,
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
838 CALL mpi_bcast(
id%DKEEP(3),1,mpi_double_precision,master,
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
1026 CALL mpi_bcast(
id%DKEEP(4),2,mpi_double_precision,
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
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_double_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)
1268 CALL mpi_bcast(cntl3, 1, mpi_double_precision,
1269 & master,
id%COMM, ierr)
1270 IF (
id%MYID .EQ. master) cntl5 =
id%CNTL(5)
1271 CALL mpi_bcast(cntl5, 1, mpi_double_precision,
1272 & master,
id%COMM, ierr)
1273 IF (
id%MYID .EQ. master) cntl6 =
id%CNTL(6)
1274 CALL mpi_bcast(cntl6, 1, mpi_double_precision,
1275 & master,
id%COMM, ierr)
1276 IF (
id%MYID .EQ. master)
id%DKEEP(8) =
id%CNTL(7)
1277 CALL mpi_bcast(
id%DKEEP(8), 1, mpi_double_precision,
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.0d0
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)*1d-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
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(dble(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.0d10*anorminf,
1421 & sqrt(huge(anorminf))/1.0d8)
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)
1465 CALL mpi_bcast( cntl4, 1, mpi_double_precision,
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 ZMUMPS_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
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 zmumps_lbufr_bytes8 = int(keep( 380 ),8) * int(keep( 35 ),8)
2349 ELSE
2350 zmumps_lbufr_bytes8 = int(keep( 44 ),8) * int(keep( 35 ),8)
2351 ENDIF
2352
2353
2354
2355 zmumps_lbufr_bytes8 =
max( zmumps_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 = dble(keep465copy)/dble(1000)
2364 zmumps_lbufr_bytes8 =
max(zmumps_lbufr_bytes8,
2365 & int(
2366 & ratiok465*
2367 & dble(
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 zmumps_lbufr_bytes8 = zmumps_lbufr_bytes8
2397 & + int( 2.0d0 * dble(
max(perlu,min_perlu))*
2398 & dble(zmumps_lbufr_bytes8)/100d0, 8)
2399 zmumps_lbufr_bytes8 =
min(zmumps_lbufr_bytes8,
2400 & int(huge(i4)-100,8))
2401 zmumps_lbufr_bytes = int( zmumps_lbufr_bytes8 )
2402 IF (keep(48)==5) THEN
2403
2404
2405
2406
2407 id%KEEP8(21) =
id%KEEP8(22) +
2408 & int( dble(
max(perlu,min_perlu))*
2409 & dble(
id%KEEP8(22))/100d0,8)
2410 ENDIF
2411
2412
2413
2414
2415
2416
2417
2418
2419 IF (keep(486).NE.0) THEN
2420 zmumps_lbuf8 = int( dble(keep(213)) / 100.0d0 *
2421 & dble(keep(379)) * dble(keep(35)), 8 )
2422 ELSE
2423 zmumps_lbuf8 = int( dble(keep(213)) / 100.0d0 *
2424 & dble(keep(43)) * dble(keep(35)), 8 )
2425 ENDIF
2426 zmumps_lbuf8 =
max( zmumps_lbuf8, 100000_8 )
2427 zmumps_lbuf8 = zmumps_lbuf8
2428 & + int( 2.0d0 * dble(
max(perlu,min_perlu))*
2429 & dble(zmumps_lbuf8)/100d0, 8)
2430
2431 zmumps_lbuf8 =
min(zmumps_lbuf8, int(huge(i4)-100,8))
2432
2433
2434
2435
2436 zmumps_lbuf8 =
max(zmumps_lbuf8, zmumps_lbufr_bytes8+3*keep(34))
2437 zmumps_lbuf = int(zmumps_lbuf8)
2438 IF(
id%KEEP(48).EQ.4)
THEN
2439 zmumps_lbufr_bytes=zmumps_lbufr_bytes*5
2440 zmumps_lbuf=zmumps_lbuf*5
2441 ENDIF
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452 zmumps_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 zmumps_lbuf_int = zmumps_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 ) zmumps_lbufr_bytes,
2471 & zmumps_lbuf, zmumps_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)= (zmumps_lbuf_int+keep(34)-1)/keep(34)
2487 IF (lpok) THEN
2488 WRITE(lp,*)
id%MYID,
2489 & ':Allocation error in ZMUMPS_BUF_ALLOC_SMALL_BUF'
2491 ENDIF
2492 GO TO 110
2493 END IF
2494
2495
2496
2497
2498
2499 zmumps_lbufr = (zmumps_lbufr_bytes+keep(34)-1)/keep(34)
2500 ALLOCATE( bufr( zmumps_lbufr ),stat=ierr )
2501 IF ( ierr .NE. 0 ) THEN
2503 id%INFO(2) = zmumps_lbufr
2504 IF (lpok) THEN
2505 WRITE(lp,*)
2506 & ': Allocation error for BUFR(', zmumps_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)/(dble(
id%NSLAVES))
2695 id%DKEEP(17) =
max(
id%DKEEP(18), avg_flops/dble(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,zmumps_lbufr
2728 & , zmumps_lbufr_bytes, zmumps_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
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.0d0
3010 id%DKEEP(16) = 0.0d0
3011 ENDIF
3012 IF (
id%NPROCS .GT. 1)
THEN
3013
3015 & mpi_double_precision, mpi_sum, master,
id%COMM, ierr)
3016 IF (
id%MYID.EQ.master) timeavg = tmptime
3018 & mpi_double_precision, mpi_sum, master,
id%COMM, ierr)
3019 IF (
id%MYID.EQ.master) flopavg = tmpflop
3020 IF (
id%MYID.EQ.master)
THEN
3021 timeavg = timeavg /
id%NSLAVES
3022 flopavg = flopavg /
id%NSLAVES
3023 ENDIF
3025 & mpi_double_precision, mpi_max, master,
id%COMM, ierr)
3027 & mpi_double_precision, mpi_max, master,
id%COMM, ierr)
3028
3029 IF ( prokg ) THEN
3030 WRITE(mpg,190) flopavg, flopmax
3031 WRITE(mpg,188) timeavg, timemax
3032 ENDIF
3033 ELSE
3034
3035 IF ( prokg ) THEN
3036 WRITE(mpg,189)
id%DKEEP(16)
3037 WRITE(mpg,187)
id%DKEEP(95)
3038 ENDIF
3039 ENDIF
3040 ENDIF
3041 IF ( prokg ) THEN
3042 IF (
id%INFO(1) .GE.0)
THEN
3043 WRITE(mpg,180)
id%DKEEP(94)
3044 ELSE
3045 WRITE(mpg,185)
id%DKEEP(94)
3046 ENDIF
3047 ENDIF
3048
3049
3050
3051
3052 rinfo(4) = rinfo(3)
3053
3054
3055
3057 & mpi_double_precision,
3058 & mpi_sum, master,
id%COMM, ierr)
3059
3060
3061 keep(247) = 0
3062 CALL mpi_reduce( keep(246), keep(247), 1, mpi_integer,
3063 & mpi_max, master,
id%COMM, ierr)
3064
3065
3067 & mpi_double_precision,
3068 & mpi_max, master,
id%COMM, ierr)
3069
3071 & mpi_double_precision,
3072 & mpi_sum, master,
id%COMM, ierr)
3074 & mpi_sum, master,
id%COMM )
3075
3076 IF (
id%MYID.EQ.0)
THEN
3077
3078 rinfog(16) = dble(
id%KEEP8(6)*int(keep(35),8))/dble(1d6)
3079 IF (keep(201).LE.0) THEN
3080 rinfog(16) = zero
3081 ENDIF
3082 ENDIF
3086
3088 & 1, mpi_integer8,
3089 & mpi_sum, master,
id%COMM, ierr)
3090 IF (
id%MYID.EQ.master)
THEN
3092 ENDIF
3093
3095 & mpi_max,
id%COMM, ierr)
3096
3097
3098
3099 keep(133) = infog(11)
3100 CALL mpi_reduce(
id%INFO(12), infog(12), 3, mpi_integer,
3101 & mpi_sum, master,
id%COMM, ierr)
3102 CALL mpi_reduce( keep(103), infog(25), 1, mpi_integer,
3103 & mpi_sum, master,
id%COMM, ierr)
3104 keep(229) = infog(25)
3105 CALL mpi_reduce( keep(105), infog(25), 1, mpi_integer,
3106 & mpi_sum, master,
id%COMM, ierr)
3107 keep(230) = infog(25)
3108
3109 id%INFO(25) = keep(98)
3111 & mpi_sum,
id%COMM, ierr)
3112
3115
3120
3121 id%INFO(28) =
id%INFO(27)
3122 infog(35) = infog(29)
3123
3124
3125
3126 IF ( keep(486) .NE. 0 ) THEN
3127
3130
3131
3132
3135
3137 & , 1, mpi_double_precision,
3138 & mpi_sum, master,
id%COMM, ierr)
3140 & , 1, mpi_double_precision,
3141 & mpi_sum, master,
id%COMM, ierr)
3143 & , 1, mpi_double_precision,
3144 & mpi_sum, master,
id%COMM, ierr)
3146 & , 1, mpi_double_precision,
3147 & mpi_sum, master,
id%COMM, ierr)
3149 & , 1, mpi_double_precision,
3150 & mpi_sum, master,
id%COMM, ierr)
3152 & , 1, mpi_double_precision,
3153 & mpi_sum, master,
id%COMM, ierr)
3155 & , 1, mpi_double_precision,
3156 & mpi_sum, master,
id%COMM, ierr)
3158 & , 1, mpi_double_precision,
3159 & mpi_sum, master,
id%COMM, ierr)
3161 & , 1, mpi_double_precision,
3162 & mpi_sum, master,
id%COMM, ierr)
3164 & tmp_flop_frswap_compress
3165 & , 1, mpi_double_precision,
3166 & mpi_sum, master,
id%COMM, ierr)
3168 & tmp_flop_midblk_compress
3169 & , 1, mpi_double_precision,
3170 & mpi_sum, master,
id%COMM, ierr)
3172 & , 1, mpi_double_precision,
3173 & mpi_sum, master,
id%COMM, ierr)
3175 & , 1, mpi_double_precision,
3176 & mpi_sum, master,
id%COMM, ierr)
3178 & , 1, mpi_double_precision,
3179 & mpi_sum, master,
id%COMM, ierr)
3181 & , 1, mpi_double_precision,
3182 & mpi_sum, master,
id%COMM, ierr)
3184 & , 1, mpi_double_precision,
3185 & mpi_sum, master,
id%COMM, ierr)
3187 & , 1, mpi_double_precision,
3188 & mpi_sum, master,
id%COMM, ierr)
3190 & , 1, mpi_double_precision,
3191 & mpi_sum, master,
id%COMM, ierr)
3193 & , 1, mpi_double_precision,
3194 & mpi_sum, master,
id%COMM, ierr)
3196 & , 1, mpi_double_precision,
3197 & mpi_sum, master,
id%COMM, ierr)
3199 & , 1, mpi_double_precision,
3200 & mpi_sum, master,
id%COMM, ierr)
3202 & , 1, mpi_integer,
3203 & mpi_sum, master,
id%COMM, ierr)
3204 IF (
id%NPROCS.GT.1)
THEN
3208 & , 1, mpi_double_precision,
3209 & mpi_sum, master,
id%COMM, ierr)
3210 IF (
id%MYID.EQ.master)
THEN
3212 ENDIF
3214 & , 1, mpi_double_precision,
3215 & mpi_min, master,
id%COMM, ierr)
3217 & , 1, mpi_double_precision,
3218 & mpi_max, master,
id%COMM, ierr)
3219 ENDIF
3221 & , 1, mpi_double_precision,
3222 & mpi_sum, master,
id%COMM, ierr)
3224 & , 1, mpi_double_precision,
3225 & mpi_sum, master,
id%COMM, ierr)
3227 & , 1, mpi_double_precision,
3228 & mpi_sum, master,
id%COMM, ierr)
3230 & , 1, mpi_double_precision,
3231 & mpi_sum, master,
id%COMM, ierr)
3233 & , 1, mpi_double_precision,
3234 & mpi_sum, master,
id%COMM, ierr)
3236 & , 1, mpi_double_precision,
3237 & mpi_sum, master,
id%COMM, ierr)
3239 & , 1, mpi_double_precision,
3240 & mpi_sum, master,
id%COMM, ierr)
3242 & , 1, mpi_double_precision,
3243 & mpi_sum, master,
id%COMM, ierr)
3245 & tmp_time_midblk_compress
3246 & , 1, mpi_double_precision,
3247 & mpi_sum, master,
id%COMM, ierr)
3249 & tmp_time_frswap_compress
3250 & , 1, mpi_double_precision,
3251 & mpi_sum, master,
id%COMM, ierr)
3253 & , 1, mpi_double_precision,
3254 & mpi_sum, master,
id%COMM, ierr)
3256 & , 1, mpi_double_precision,
3257 & mpi_sum, master,
id%COMM, ierr)
3259 & , 1, mpi_double_precision,
3260 & mpi_sum, master,
id%COMM, ierr)
3262 & , 1, mpi_double_precision,
3263 & mpi_sum, master,
id%COMM, ierr)
3265 & , 1, mpi_double_precision,
3266 & mpi_sum, master,
id%COMM, ierr)
3268 & , 1, mpi_double_precision,
3269 & mpi_sum, master,
id%COMM, ierr)
3271 & , 1, mpi_double_precision,
3272 & mpi_sum, master,
id%COMM, ierr)
3274 & , 1, mpi_double_precision,
3275 & mpi_sum, master,
id%COMM, ierr)
3277 & , 1, mpi_double_precision,
3278 & mpi_sum, master,
id%COMM, ierr)
3280 & , 1, mpi_double_precision,
3281 & mpi_sum, master,
id%COMM, ierr)
3283 & , 1, mpi_double_precision,
3284 & mpi_sum, master,
id%COMM, ierr)
3286 & , 1, mpi_double_precision,
3287 & mpi_sum, master,
id%COMM, ierr)
3289 & , 1, mpi_double_precision,
3290 & mpi_sum, master,
id%COMM, ierr)
3292 & , 1, mpi_double_precision,
3293 & mpi_sum, master,
id%COMM, ierr)
3295 & , 1, mpi_double_precision,
3296 & mpi_sum, master,
id%COMM, ierr)
3298 & , 1, mpi_double_precision,
3299 & mpi_sum, master,
id%COMM, ierr)
3300 IF (
id%MYID.EQ.master)
THEN
3301 IF (
id%NPROCS.GT.1)
THEN
3302
3303
3352 ENDIF
3354 &
id%KEEP8(49), prokg, mpg)
3355
3356
3357
3358
3360 frontwise = 0
3361
3362 IF (lpok) THEN
3363 IF (cntl(7) < 0.0d0) THEN
3364
3365
3366 WRITE(lp,'(/A/,A/,A/,A,A)')
3367 & ' WARNING in BLR input setting',
3368 & ' CNTL(7) < 0 is experimental: ',
3369 & ' RRQR precision = |CNTL(7| x ||A_pre||, ',
3370 & ' where A_pre is the preprocessed matrix as defined',
3371 & ' in the Users guide '
3372 ENDIF
3373 ENDIF
3375 & keep(489),
id%DKEEP, n,
id%ICNTL(36),
3376 & keep(487), keep(488), keep(490),
3377 & keep(491), keep(50), keep(486),
3378 & keep(472), keep(475), keep(478), keep(480),
3379 & keep(481),
3380 & keep(483), keep(484),
3381 &
id%KEEP8(110),
id%KEEP8(49),
3382 & keep(28),
id%NPROCS, mpg, prokg)
3383
3384 rinfog(14) =
id%DKEEP(56)
3385 ELSE
3386 rinfog(14) = 0.0d00
3387 ENDIF
3388 ENDIF
3389
3390
3391
3392 IF(keep(110) .EQ. 1) THEN
3393
3394
3395 id%INFO(18) = keep(109)
3397 & mpi_sum,
id%COMM, ierr)
3398 ELSE
3400 keep(109) = 0
3401 keep(112) = 0
3402 ENDIF
3403 IF (
id%MYID.EQ.master)
THEN
3404
3405 infog(28)=keep(112)+keep(17)
3406 ENDIF
3407
3408
3409
3410
3411
3412
3413
3414 IF (keep(17) .NE. 0) THEN
3415 IF (
id%MYID .EQ. id_root)
THEN
3416
3417
3418
3419 id%INFO(18)=
id%INFO(18)+keep(17)
3420 ENDIF
3421 IF (id_root .EQ. master) THEN
3422 IF (
id%MYID.EQ.master)
THEN
3423
3424
3425
3426
3427
3428
3429
3430
3431 DO i= keep(17), 1, -1
3432
3433
3434 id%PIVNUL_LIST(keep(112)+i)=
id%PIVNUL_LIST(keep(109)+i)
3435 ENDDO
3436 ENDIF
3437 ELSE
3438
3439
3440
3441
3442
3443 IF (
id%MYID .EQ. id_root)
THEN
3444 CALL mpi_send(
id%PIVNUL_LIST(keep(109)+1), keep(17),
3445 & mpi_integer, master, zero_piv,
3447 ELSE IF (
id%MYID .EQ. master)
THEN
3448 CALL mpi_recv(
id%PIVNUL_LIST(keep(112)+1), keep(17),
3449 & mpi_integer, id_root, zero_piv,
3450 &
id%COMM, status, ierr )
3451 ENDIF
3452 ENDIF
3453 ENDIF
3454
3455
3456
3457
3458
3459
3460
3461 IF(keep(110) .EQ. 1) THEN
3462 ALLOCATE(itmp2(
id%NPROCS),stat = ierr )
3463 IF ( ierr .GT. 0 ) THEN
3465 id%INFO(2)=
id%NPROCS
3466 END IF
3468 &
id%COMM,
id%MYID )
3469 IF (
id%INFO(1).LT.0)
GOTO 490
3471 & itmp2(1), 1, mpi_integer,
3472 & master,
id%COMM, ierr)
3473 IF(
id%MYID .EQ. master)
THEN
3474 posbuf = itmp2(1)+1
3475
3476
3477 keep(220)=1
3478 DO i = 1,
id%NPROCS-1
3479 CALL mpi_recv(
id%PIVNUL_LIST(posbuf), itmp2(i+1),
3480 & mpi_integer,i,
3481 & zero_piv,
id%COMM, status, ierr)
3482
3483
3484
3485
3486 CALL mpi_send(posbuf, 1, mpi_integer, i, zero_piv,
3488 posbuf = posbuf + itmp2(i+1)
3489 ENDDO
3490 ELSE
3491 CALL mpi_send(
id%PIVNUL_LIST(1), keep(109), mpi_integer,
3492 & master,zero_piv,
id%COMM, ierr)
3493 CALL mpi_recv( keep(220), 1, mpi_integer, master, zero_piv,
3494 &
id%COMM, status, ierr )
3495 ENDIF
3496 ENDIF
3497
3498
3499
3501 & mpi_double_precision,
3502 & mpi_min, master,
id%COMM, ierr )
3504 & mpi_double_precision,
3505 & mpi_min, master,
id%COMM, ierr )
3507 & mpi_double_precision,
3508 & mpi_max, master,
id%COMM, ierr )
3509
3510
3511
3512 CALL mpi_reduce(
id%KEEP8(80), itemp8, 1, mpi_integer8,
3513 & mpi_sum, master,
id%COMM, ierr )
3514 IF (
id%MYID .EQ. master)
THEN
3516 ENDIF
3517
3518
3519
3521 & mpi_max, master,
id%COMM, ierr )
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534 IF (
id%MYID.EQ.master .AND. lscal. and. keep(258).NE.0)
THEN
3535 k =
min(keep(143), keep(17))
3537 DO i = 1, keep(112)+ k
3538
3540 &
id%ROWSCA(
id%PIVNUL_LIST(i)),
3541 &
id%DKEEP(6), keep(259))
3543 &
id%COLSCA(
id%PIVNUL_LIST(i)),
3544 &
id%DKEEP(6), keep(259))
3545 ENDDO
3546 ENDIF
3547
3548
3549
3550 IF (keep(258).NE.0) THEN
3551
3552 IF (keep(260).EQ.-1) THEN
3553 id%DKEEP(6)=-
id%DKEEP(6)
3554 id%DKEEP(7)=-
id%DKEEP(7)
3555 ENDIF
3556
3557
3558
3560 &
id%COMM,
id%DKEEP(6), keep(259),
3561 & rinfog(12), infog(34),
id%NPROCS)
3562
3563
3564
3565 IF (
id%KEEP(50).EQ.0 .AND.
id%MYID.EQ. master)
THEN
3566
3567
3568
3569 IF (
id%KEEP(23).NE.0)
THEN
3572
3573
3576
3577
3578
3579 ENDIF
3580 ENDIF
3581 ENDIF
3582 490 IF (allocated(itmp2)) DEALLOCATE(itmp2)
3583 IF ( prokg ) THEN
3584
3585
3586
3587 WRITE(mpg,99984) rinfog(2),rinfog(3),keep(52),
3589 &
id%KEEP8(128), infog(11),
id%KEEP8(110)
3590 IF (
id%KEEP(50) == 0)
THEN
3591
3592 WRITE(mpg, 99985) infog(12)
3593 END IF
3594 IF (
id%KEEP(50) .NE. 1)
THEN
3595
3596 WRITE(mpg, 99982) infog(13)
3597 END IF
3598 IF (keep(97) .NE. 0) THEN
3599
3600 WRITE(mpg, '(A,D16.4)')
3601 & ' Effective static pivoting thresh., CNTL(4) =', seuil
3602 WRITE(mpg, 99986) infog(25)
3603 ENDIF
3604 IF (
id%KEEP(50) == 2)
THEN
3605
3606 WRITE(mpg, 99988) keep(229)
3607
3608 WRITE(mpg, 99989) keep(230)
3609 ENDIF
3610
3611 IF (keep(110) .NE.0) THEN
3612 WRITE(mpg, 99991) keep(112)
3613 ENDIF
3614
3615 IF ( keep(19) .ne. 0 )
3616
3617 & WRITE(mpg, 99983) keep(17)
3618
3619 IF (keep(110).NE.0.OR.keep(19).NE.0)
3620
3621 & WRITE(mpg, 99992) keep(17)+keep(112)
3622
3623 WRITE(mpg, 99981) infog(14)
3624
3625
3626 IF (
id%KEEP8(108) .GT. 0_8)
THEN
3627 WRITE(mpg, 99980)
id%KEEP8(108)
3628 ENDIF
3629 IF ((keep(60).NE.0) .AND. infog(25).GT.0) THEN
3630
3631
3632 WRITE(mpg, '(A)')
3633 & " ** Warning Static pivoting was necessary"
3634 WRITE(mpg, '(A)')
3635 & " ** to factor interior variables with Schur ON"
3636 ENDIF
3637 IF (keep(258).NE.0) THEN
3638 WRITE(mpg,99978) rinfog(12)
3639 WRITE(mpg,99979) rinfog(13)
3640 WRITE(mpg,99977) infog(34)
3641 ENDIF
3642 END IF
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653#if ! defined(NO_FDM_DESCBAND)
3654
3655#endif
3656#if ! defined(NO_FDM_MAPROW)
3657
3658#endif
3659
3660
3661 500 CONTINUE
3662
3663
3664
3665 IF (
id%KEEP(46).EQ.1 .AND.
3666 &
id%KEEP(55).NE.0 .AND.
3667 &
id%MYID.EQ.master .AND.
3668 &
id%KEEP(52) .EQ. 0)
THEN
3670 ELSE
3671 IF (
associated(
id%DBLARR))
THEN
3672 DEALLOCATE(
id%DBLARR)
3674 ENDIF
3675 ENDIF
3676#if ! defined(NO_FDM_DESCBAND)
3677 IF (i_am_slave) THEN
3679 ENDIF
3680#endif
3681#if ! defined(NO_FDM_MAPROW)
3682 IF (i_am_slave) THEN
3684 ENDIF
3685#endif
3686 IF (i_am_slave) THEN
3687
3688 IF (
3689 & (
3690 & (keep(486).EQ.2)
3691 & )
3692 & .AND.
id%INFO(1).GE.0
3693 & ) THEN
3694
3695
3697 ELSE
3698
3700 ENDIF
3701 ENDIF
3702 IF (i_am_slave) THEN
3704
3705 IF (
3706 & (
3707 & (keep(486).EQ.2)
3708 & )
3709 & .AND.
id%INFO(1).GE.0
3710 & ) THEN
3713 IF (.NOT.
associated(
id%FDM_F_ENCODING))
THEN
3714 WRITE(*,*) "Internal error 2 in ZMUMPS_FAC_DRIVER"
3715 ENDIF
3716 ELSE
3718 ENDIF
3719 ENDIF
3720
3721
3722
3723
3724
3725
3726 514 CONTINUE
3727 IF ( i_am_slave ) THEN
3728 IF ((keep(201).EQ.1).OR.(keep(201).EQ.2)) THEN
3730 IF (
id%ASSOCIATED_OOC_FILES)
THEN
3731 id%ASSOCIATED_OOC_FILES = .false.
3732 ENDIF
3733 IF (ierr.LT.0 .AND.
id%INFO(1) .GE. 0)
id%INFO(1) = ierr
3734 ENDIF
3735 IF (wk_user_provided) THEN
3736
3738 ELSE IF (keep(201).NE.0) THEN
3739
3740
3741
3742
3743
3744
3745
3746 IF (
associated(
id%S))
DEALLOCATE(
id%S)
3749 ENDIF
3750 ELSE
3751 IF (wk_user_provided) THEN
3752
3754 ELSE
3755 IF (
associated(
id%S))
DEALLOCATE(
id%S)
3758 END IF
3759 END IF
3760
3761
3762
3763 513 CONTINUE
3764 IF ( i_am_slave ) THEN
3766 IF (ierr.LT.0 .AND.
id%INFO(1) .GE. 0)
id%INFO(1) = ierr
3767 ENDIF
3769 &
id%COMM,
id%MYID )
3770
3771
3772
3773
3774 517 CONTINUE
3775
3776
3777
3778 530 CONTINUE
3779
3780
3781 IF (rhs_mumps_allocated) DEALLOCATE(rhs_mumps)
3782 NULLIFY(rhs_mumps)
3783
3784 id%KEEP8(26) = keep826_save
3785 RETURN
3786 120 FORMAT(/' Local redistrib: data local/sent =',i16,i16)
3787 125 FORMAT(/' Redistrib: total data local/sent =',i16,i16)
3788 130 FORMAT(//'****** FACTORIZATION STEP ********'/)
3789 160 FORMAT(
3790 & /' Elapsed time to reformat/distribute matrix =',f12.4)
3791 166 FORMAT(' Max difference from 1 after scaling the entries',
3792 & ' for ONE-NORM (option 7/8) =',d9.2)
3793 170 FORMAT(' STATISTICS PRIOR NUMERICAL FACTORIZATION ...'/
3794 & ' Size of internal working array S =',i16/
3795 & ' Size of internal working array IS =',i16/
3796 & ' Minimum (ICNTL(14)=0) size of S =',i16/
3797 & ' Minimum (ICNTL(14)=0) size of IS =',i16/
3798 & ' Real space for original matrix =',i16/
3799 & ' Integer space for original matrix =',i16/
3800 & ' INFO(3) Real space for factors (estimated) =',i16/
3801 & ' INFO(4) Integer space for factors (estim.) =',i16/
3802 & ' Maximum frontal size (estimated) =',i16)
3803 172 FORMAT(' GLOBAL STATISTICS PRIOR NUMERICAL FACTORIZATION ...'/
3804 & ' Number of working processes =',i16/
3805 & ' ICNTL(22) Out-of-core option =',i16/
3806 & ' ICNTL(35) BLR activation (eff. choice) =',i16/
3807 & ' ICNTL(14) Memory relaxation =',i16/
3808 & ' INFOG(3) Real space for factors (estimated)=',i16/
3809 & ' INFOG(4) Integer space for factors (estim.)=',i16
3810 & ' Maximum frontal size (estimated) =',i16/
3811 & ' Number of nodes in the tree =',i16/
3812 & ' ICNTL(23) Memory allowed (value on host) =',i16/
3813 & ' Sum over all procs =',i16/
3814 & ' Memory provided by user, sum of LWK_USER =',i16/
3815 & ' Effective threshold for pivoting, CNTL(1) =',d16.4)
3816 173 FORMAT( ' Perform forward during facto, NRHS =',i16)
3817 174 FORMAT( ' KEEP(268) Relaxed pivoting effective value =',i16)
3818 180 FORMAT(/' Elapsed time for factorization =',f12.4)
3819 185 FORMAT(/' Elapsed time for (failed) factorization =',f12.4)
3820 187 FORMAT( ' Elapsed time under L0 =',f12.4)
3821 188 FORMAT( ' Elapsed time under L0 (avg/max across MPI) =',
3822 & f12.4,f12.4)
3823 189 FORMAT(/' Flops under L0 layer =',1pd12.3)
3824 190 FORMAT(/' Flops under L0 Layer (avg/max across MPI) =',
3825 & 1pd12.3,1pd12.3)
382699977 FORMAT( ' infog(34) determinant(base 2 exponent) =',I16)
382799978 FORMAT( ' rinfog(12) determinant(real part) =',F16.8)
382899979 FORMAT( ' rinfog(12) determinant(imaginary part) =',F16.8)
382999980 FORMAT( ' extra copies due to in-place stacking =',I16)
383099981 FORMAT( ' infog(14) number of memory compress =',I16)
383199982 FORMAT( ' infog(13) number of delayed pivots =',I16)
383299983 FORMAT( ' nb of singularities detected by icntl(56) =',I16)
383399991 FORMAT( ' nb of null pivots detected by icntl(24) =',I16)
383499992 FORMAT( ' infog(28) estimated deficiency =',I16)
383599984 FORMAT(/'leaving factorization with ...'/
3836 & ' rinfog(2) operations in node assembly =',1PD10.3/
3837 & ' ------(3) operations in node elimination =',1PD10.3/
3838 & ' icntl(8) scaling effectively
used =
',I16/
3839 & ' infog(9) real space
for factors =
',I16/
3840 & ' infog(10) Integer space for factors =',I16/
3841 & ' infog(11) maximum front size =',I16/
3842 & ' infog(29) number of entries in factors =',I16)
384399985 FORMAT( ' infog(12) number of off diagonal pivots =',I16)
384499986 FORMAT( ' infog(25) number of tiny pivots(
static) =
',I16)
384599988 FORMAT( ' number of 2x2 pivots in type 1 nodes =',I16)
384699989 FORMAT( ' number of 2x2 pivots in type 2 nodes =',I16)
subroutine mumps_propinfo(icntl, info, comm, id)
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)
for(i8=*sizetab-1;i8 >=0;i8--)
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, public zmumps_buf_max_array_minsize(nfs4father, ierr)
subroutine, public zmumps_buf_deall_max_array()
subroutine, public zmumps_buf_alloc_small_buf(size, ierr)
subroutine, public zmumps_buf_dist_irecv_size(zmumps_lbufr_bytes)
subroutine, public zmumps_buf_ini_myid(myid)
subroutine, public zmumps_buf_deall_small_buf(ierr)
subroutine, public zmumps_free_l0_omp_factors(id_l0_omp_factors)
subroutine, public zmumps_init_l0_omp_factors(id_l0_omp_factors)
subroutine, public zmumps_load_init(id, memory_md_arg, maxs)
subroutine, public zmumps_load_end(info1, nslaves, ierr)
subroutine, public zmumps_load_set_inicost(cost_subtree_arg, k64, dk15, k375, maxs)
subroutine, public zmumps_load_update(check_flops, process_bande, inc_load, keep, keep8)
subroutine, public zmumps_blr_init_module(initial_size, info)
subroutine, public zmumps_blr_mod_to_struc(id_blrarray_encoding)
subroutine, public zmumps_blr_end_module(info1, keep8, k34, lrsolve_act_opt)
double precision flop_facto_lr
double precision time_decomp_ucfs
double precision time_update
double precision time_update_frfr
double precision time_frfronts
double precision time_update_lrlr2
double precision flop_trsm
double precision flop_lrgain
double precision time_frtrsm
double precision flop_panel
double precision time_decomp_maplig1
double precision time_decomp_asms2s
double precision time_frswap_compress
double precision time_panel
double precision flop_decompress
double precision flop_cb_compress
double precision time_update_lrlr1
double precision time_cb_compress
double precision time_decomp
double precision time_decomp_asm1
double precision flop_facto_fr
double precision mry_lu_lrgain
double precision time_decomp_locasm2
double precision time_compress
double precision time_midblk_compress
double precision mry_lu_fr
double precision min_flop_facto_lr
double precision time_update_frlr
double precision time_decomp_asms2m
double precision mry_cb_fr
double precision mry_cb_lrgain
double precision flop_accum_compress
double precision flop_frswap_compress
double precision time_update_lrlr3
double precision max_flop_facto_lr
double precision flop_trsm_fr
double precision time_fac_sq
subroutine compute_global_gains(nb_entries_factor, flop_number, nb_entries_factor_withlr, prokg, mpg)
double precision avg_flop_facto_lr
double precision time_lrtrsm
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_cb_decompress
double precision flop_update_lr
double precision flop_midblk_compress
double precision time_fac_i
double precision flop_frfronts
double precision time_diagcopy
double precision time_fac_mq
double precision flop_trsm_lr
double precision time_lr_module
double precision flop_update_lrlr3
double precision flop_update_fr
subroutine init_stats_global(id)
double precision flop_compress
subroutine zmumps_ooc_end_facto(id, ierr)
subroutine zmumps_ooc_clean_pending(ierr)
subroutine zmumps_clean_ooc_data(id, ierr)
subroutine, public zmumps_ooc_init_facto(id, maxs)
subroutine static(v, vr, a, ar, ms, in, igrnod, weight_md, wfext)
subroutine zmumps_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 zmumps_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 zmumps_free_id_data_modules(id_fdm_f_encoding, id_blrarray_encoding, keep8, k34)
subroutine zmumps_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, zmumps_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 zmumps_deter_square(deter, nexp)
subroutine zmumps_deter_sign_perm(deter, n, visited, perm)
subroutine zmumps_deter_reduction(comm, deter_in, nexp_in, deter_out, nexp_out, nprocs)
subroutine zmumps_deter_scaling_inverse(deter, nexp)
subroutine zmumps_updatedeter_scaling(piv, deter, nexp)
subroutine zmumps_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 zmumps_maxelt_size(eltptr, nelt, maxelt_size)
subroutine zmumps_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 zmumps_avgmax_stat8(prokg, mpg, val, nslaves, print_maxavg, comm, msg)
subroutine zmumps_extract_schur_redrhs(id)
subroutine zmumps_print_allocated_mem(prok, prokg, print_maxavg, mp, mpg, info16, infog18, infog19, nslaves, irank, keep)
subroutine zmumps_anorminf(id, anorminf, lscal, eff_size_schur)
subroutine zmumps_fac_a(n, nz8, nsca, aspk, irn, icn, colsca, rowsca, wk, lwk8, wk_real, lwk_real, icntl, info)
subroutine zmumps_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 zmumps_init_root_fac(n, root, fils, iroot, keep, info)