26#if
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 (DMUMPS_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(DMUMPS_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 :: DMUMPS_LBUFR, DMUMPS_LBUFR_BYTES
103 INTEGER(8) :: DMUMPS_LBUFR_BYTES8
104 INTEGER, ALLOCATABLE, DIMENSION(:) :: BUFR
105
106 INTEGER :: DMUMPS_LBUF, DMUMPS_LBUF_INT
107 INTEGER(8) :: DMUMPS_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, 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 DOUBLE PRECISION, TARGET :: S_DUMMY_ARG(1)
126 DOUBLE PRECISION, 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 DOUBLE PRECISION CZERO
136 parameter( czero = 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 :: , SEUIL, SEUIL_LDLT_NIV2, Thresh_Seuil
149 DOUBLE PRECISION :: 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 :: TMP_FLOP_TRSM
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 DOUBLE PRECISION, 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 ::
216 INTEGER BUREGISTRE(12)
217 INTEGER BUINTSZ, , 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 DOUBLE PRECISION, DIMENSION(:), POINTER :: MYA_loc
231 INTEGER, TARGET :: DUMMYIRN_loc(1), DUMMYJCN_loc(1)
232 DOUBLE PRECISION, TARGET :: DUMMYA_loc(1)
233 INTEGER,DIMENSION(:),POINTER::ICNTL
235 INTEGER
236 INTEGER(8) :: TOTAL_BYTES
237 INTEGER(8) :: , 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 DOUBLE PRECISION, DIMENSION(:), POINTER :: RHS_MUMPS
249 LOGICAL :: RHS_MUMPS_ALLOCATED
250 INTEGER ::
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
795 ENDIF
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
815 & master,
id%COMM, ierr)
816 lscal = ((keep(52) .GT. 0) .AND. (keep(52) .LE. 8))
817 IF (lscal) THEN
818
819 IF (
id%MYID.EQ.master )
THEN
821 ENDIF
822
823
824
825
826 IF (keep(52) .EQ. 7) THEN
827
828 k231= keep(231)
829 k232= keep(232)
830 k233= keep(233)
831 ELSEIF (keep(52) .EQ. 8) THEN
832
833 k231= keep(239)
834 k232= keep(240)
835 k233= keep(241)
836 ENDIF
837 CALL mpi_bcast(
id%DKEEP(3),1,mpi_double_precision,master,
839
840 IF ( ((keep(52).EQ.7).OR.(keep(52).EQ.8)) .AND.
841 & keep(54).NE.0 ) THEN
842
843
844
845
846
847
848 IF (
id%MYID .NE. master )
THEN
849 IF (
associated(
id%COLSCA))
850 &
DEALLOCATE(
id%COLSCA )
851 IF (
associated(
id%ROWSCA))
852 &
DEALLOCATE(
id%ROWSCA )
853 ALLOCATE(
id%COLSCA(n), stat=ierr)
854 IF (ierr .GT.0) THEN
857 ENDIF
858 ALLOCATE(
id%ROWSCA(n), stat=ierr)
859 IF (ierr .GT.0) THEN
862 ENDIF
863 ENDIF
864 m = n
865 bumaxmn=m
866 IF(n > bumaxmn) bumaxmn = n
867 liwk = 4*bumaxmn
868 ALLOCATE (iwk(liwk),burp(m),bucp(n),
869 & burs(2* (
id%NPROCS)),bucs(2* (
id%NPROCS)),
870 & stat=allocok)
871 IF (allocok > 0) THEN
873 id%INFO(2)=liwk+m+n+4* (
id%NPROCS)
874 ENDIF
875
878 IF (
id%INFO(1).LT.0)
GOTO 517
879
880 bujob = 1
881
882 lwk_real = 1
883 ALLOCATE(wk_real(lwk_real),
884 & stat=allocok)
885 IF (allocok > 0) THEN
888 ENDIF
889
892 IF (
id%INFO(1).LT.0)
GOTO 517
894 & myirn_loc(1), myjcn_loc(1), mya_loc(1),
896 & m, n,
id%NPROCS,
id%MYID,
id%COMM,
897 & burp, bucp,
898 & burs, bucs, buregistre,
899 & iwk, liwk,
900 & buintsz, buresz, bujob,
901 &
id%ROWSCA(1),
id%COLSCA(1), wk_real, lwk_real,
903 & k231, k232, k233,
905 & sconeerr, scinferr)
906 IF(liwk < buintsz) THEN
907 DEALLOCATE(iwk)
908 liwk = buintsz
909 ALLOCATE(iwk(liwk), stat=allocok)
910 IF (allocok > 0) THEN
913 ENDIF
914 ENDIF
915 lwk_real = buresz
916 DEALLOCATE(wk_real)
917 ALLOCATE (wk_real(lwk_real), stat=allocok)
918 IF (allocok > 0) THEN
921 ENDIF
922
925 IF (
id%INFO(1).LT.0)
GOTO 517
926
927 bujob = 2
929 & myirn_loc(1), myjcn_loc(1), mya_loc(1),
931 & m, n,
id%NPROCS,
id%MYID,
id%COMM,
932 & burp, bucp,
933 & burs, bucs, buregistre,
934 & iwk, liwk,
935 & buintsz, buresz, bujob,
936 &
id%ROWSCA(1),
id%COLSCA(1), wk_real, lwk_real,
938 & k231, k232, k233,
940 & sconeerr, scinferr)
941 id%DKEEP(4) = sconeerr
942 id%DKEEP(5) = scinferr
943
944 DEALLOCATE(iwk, wk_real,burp,bucp,burs, bucs)
945 ELSE IF ( keep(54) .EQ. 0 ) THEN
946
947
948
949 IF ((keep(52).EQ.7).OR.(keep(52).EQ.8)) THEN
950
951
952
953 IF (
id%MYID.EQ.master)
THEN
954 colour = 0
955 ELSE
956 colour = mpi_undefined
957 ENDIF
959 & comm_for_scaling, ierr )
960 IF (
id%MYID.EQ.master)
THEN
961 m = n
962 bumaxmn=n
963 IF(n > bumaxmn) bumaxmn = n
964 liwk = 1
965 ALLOCATE(iwk(liwk),burp(1),bucp(1),
966 & burs(1),bucs(1),
967 & stat=allocok)
968 IF (allocok > 0) THEN
970 id%INFO(2)=liwk+1+1+1+1
971 GOTO 400
972 ENDIF
973 lwk_real = m + n
974 ALLOCATE (wk_real(lwk_real), stat=allocok)
975 IF (allocok > 0) THEN
978 GOTO 400
979 ENDIF
982 bujob = 1
984 &
id%IRN(1),
id%JCN(1),
id%A(1),
986 & m, n, scnprocs, scmyid, comm_for_scaling,
987 & burp, bucp,
988 & burs, bucs, buregistre,
989 & iwk, liwk,
990 & buintsz, buresz, bujob,
991 &
id%ROWSCA(1),
id%COLSCA(1), wk_real, lwk_real,
993 & k231, k232, k233,
995 & sconeerr, scinferr)
996 IF(lwk_real < buresz) THEN
998 GOTO 400
999 ENDIF
1000 bujob = 2
1002 &
id%JCN(1),
id%A(1),
1004 & m, n, scnprocs, scmyid, comm_for_scaling,
1005 & burp, bucp,
1006 & burs, bucs, buregistre,
1007 & iwk, liwk,
1008 & buintsz, buresz, bujob,
1009 &
id%ROWSCA(1),
id%COLSCA(1), wk_real, lwk_real,
1011 & k231, k232, k233,
1013 & sconeerr, scinferr)
1014 id%DKEEP(4) = sconeerr
1015 id%DKEEP(5) = scinferr
1016 400 CONTINUE
1017 IF (allocated(wk_real)) DEALLOCATE(wk_real)
1018 IF (allocated(iwk)) DEALLOCATE(iwk)
1019 IF (allocated(burp)) DEALLOCATE(burp)
1020 IF (allocated(bucp)) DEALLOCATE(bucp)
1021 IF (allocated(burs)) DEALLOCATE(burs)
1022 IF (allocated(bucs)) DEALLOCATE(bucs)
1023 ENDIF
1024
1025 CALL mpi_bcast(
id%DKEEP(4),2,mpi_double_precision,
1026 & master,
id%COMM, ierr )
1027 IF (
id%MYID.EQ.master)
THEN
1028
1029
1031 ENDIF
1034 IF (
id%INFO(1).LT.0)
GOTO 517
1035 ELSE IF (
id%MYID.EQ.master)
THEN
1036
1037
1038
1039 IF (keep(52).GT.0 .AND. keep(52).LE.6) THEN
1040
1041
1042
1043
1044 IF ( keep(52) .eq. 5 .or.
1045 & keep(52) .eq. 6 ) THEN
1046
1047
1048
1049
1051 ELSE
1052 lwk = 1_8
1053 END IF
1054 lwk_real = 5 * n
1055 ALLOCATE( wk_real( lwk_real ), stat = ierr )
1056 IF ( ierr .GT. 0 ) THEN
1058 id%INFO(2) = lwk_real
1059 GOTO 137
1060 END IF
1061 ALLOCATE( wk( lwk ), stat = ierr )
1062 IF ( ierr .GT. 0 ) THEN
1065 GOTO 137
1066 END IF
1068 &
id%IRN(1),
id%JCN(1),
1069 &
id%COLSCA(1),
id%ROWSCA(1),
1070 & wk, lwk, wk_real, lwk_real, icntl(1),
id%INFO(1) )
1071 DEALLOCATE( wk_real )
1072 DEALLOCATE( wk )
1073 ENDIF
1074 ENDIF
1075 ENDIF
1076 IF (keep(125).NE.0) THEN
1077
1078
1079
1080
1081
1082 IF ((keep(60).GT.0) .and. (keep(116).GT.0)) THEN
1083
1084 IF ( ((keep(52).EQ.7).OR.(keep(52).EQ.8)) .AND.
1085 & keep(54).NE.0 ) THEN
1086
1087 DO i=1, n
1088 IF (
id%SYM_PERM(i).GT.
id%N-keep(116))
THEN
1091 ENDIF
1092 ENDDO
1093 ELSE IF (
id%MYID .EQ. master)
THEN
1094
1095 DO i=1, n
1096 IF (
id%SYM_PERM(i).GT.
id%N-keep(116))
THEN
1099 ENDIF
1100 ENDDO
1101 ENDIF
1102 ENDIF
1103 ENDIF
1104 IF (
id%MYID.EQ.master)
THEN
1107
1108
1109
1110 IF (prokg.AND.(keep(52).EQ.7.OR.keep(52).EQ.8)
1111 & .AND. (k233+k231+k232).GT.0) THEN
1112 IF (k232.GT.0)
WRITE(mpg, 166)
id%DKEEP(4)
1113 ENDIF
1114 ENDIF
1115 ENDIF
1116
1117
1118 lscal = (lscal .OR. (keep(52) .EQ. -1) .OR. keep(52) .EQ. -2)
1119 IF (lscal .AND. keep(258).NE.0 .AND.
id%MYID .EQ. master)
THEN
1123 & keep(259))
1124 ENDDO
1125 IF (keep(50) .EQ. 0) THEN
1129 & keep(259))
1130 ENDDO
1131 ELSE
1132
1133
1134
1135
1136
1137
1139 ENDIF
1140
1141
1143 ENDIF
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155 137 CONTINUE
1156
1157
1158
1159
1160
1161
1162
1163
1164 IF (
associated(
id%root%RHS_CNTR_MASTER_ROOT))
THEN
1165 DEALLOCATE (
id%root%RHS_CNTR_MASTER_ROOT)
1166 NULLIFY (
id%root%RHS_CNTR_MASTER_ROOT)
1167 ENDIF
1168
1169 IF (
id%MYID.EQ.master.AND. keep(252).EQ.1 .AND.
1170 &
id%NRHS .NE.
id%KEEP(253) )
THEN
1171
1172
1174 id%INFO(2)=
id%KEEP(253)
1175 ENDIF
1176
1177
1178 IF (
id%KEEP(252) .EQ. 1)
THEN
1179 IF (
id%MYID.NE.master )
THEN
1181 id%KEEP(255) = n*
id%KEEP(253)
1182 ALLOCATE(rhs_mumps(
id%KEEP(255)),stat=ierr)
1183 IF (ierr > 0) THEN
1185 id%INFO(2)=
id%KEEP(255)
1186 IF (lpok)
1187 & WRITE(lp,*) 'ERROR while allocating RHS on a slave'
1188 NULLIFY(rhs_mumps)
1189 ENDIF
1190 rhs_mumps_allocated = .true.
1191 ELSE
1192
1193 id%KEEP(254)=
id%LRHS
1194 id%KEEP(255)=
id%LRHS*(
id%KEEP(253)-1)+
id%N
1196 rhs_mumps_allocated = .false.
1197 IF (lscal) THEN
1198
1199
1200
1201 DO k=1,
id%KEEP(253)
1202 DO i=1, n
1203 rhs_mumps(
id%KEEP(254) * (k-1) + i )
1204 & = rhs_mumps(
id%KEEP(254) * (k-1) + i )
1206 ENDDO
1207 ENDDO
1208 ENDIF
1209 ENDIF
1210 ELSE
1212 ALLOCATE(rhs_mumps(1),stat=ierr)
1213 IF (ierr > 0) THEN
1216 IF (lpok)
1217 & WRITE(lp,*) 'ERREUR while allocating RHS on a slave'
1218 NULLIFY(rhs_mumps)
1219 ENDIF
1220 rhs_mumps_allocated = .true.
1221 ENDIF
1223 &
id%COMM,
id%MYID )
1224 IF (
id%INFO(1).lt.0 )
GOTO 517
1225 IF (keep(252) .EQ. 1) THEN
1226
1227
1228
1229
1230
1231 DO i= 1,
id%KEEP(253)
1232 CALL mpi_bcast(rhs_mumps((i-1)*
id%KEEP(254)+1), n,
1233 & mpi_double_precision, master,
id%COMM,ierr)
1234 END DO
1235 ENDIF
1236
1237
1238 keep(110)=
id%ICNTL(24)
1239 CALL mpi_bcast(keep(110), 1, mpi_integer,
1240 & master,
id%COMM, ierr)
1241
1242 IF (keep(110).NE.1) keep(110)=0
1243 IF (keep(219).NE.0) THEN
1245 IF (ierr .NE. 0) THEN
1246
1247
1248
1250 id%INFO(2) =
max(keep(108),1)
1251 END IF
1252 ENDIF
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266 IF (
id%MYID .EQ. master) cntl3 =
id%CNTL(3)
1267 CALL mpi_bcast(cntl3, 1, mpi_double_precision,
1268 & master,
id%COMM, ierr)
1269 IF (
id%MYID .EQ. master) cntl5 =
id%CNTL(5)
1270 CALL mpi_bcast(cntl5, 1, mpi_double_precision,
1271 & master,
id%COMM, ierr)
1272 IF (
id%MYID .EQ. master) cntl6 =
id%CNTL(6)
1273 CALL mpi_bcast(cntl6, 1, mpi_double_precision,
1274 & master,
id%COMM, ierr)
1275 IF (
id%MYID .EQ. master)
id%DKEEP(8) =
id%CNTL(7)
1276 CALL mpi_bcast(
id%DKEEP(8), 1, mpi_double_precision,
1277 & master,
id%COMM, ierr)
1278 id%DKEEP(11) =
id%DKEEP(8)/
id%KEEP(461)
1279 id%DKEEP(12) =
id%DKEEP(8)/
id%KEEP(462)
1280 IF (keep(486).EQ.0)
id%DKEEP(8) = zero
1281 compute_anorminf = .false.
1282 IF ( (keep(486) .NE. 0).AND. (
id%DKEEP(8).LT.zero))
THEN
1283 compute_anorminf = .true.
1284 ENDIF
1285 IF (keep(19).NE.0) THEN
1286
1287 compute_anorminf = .true.
1288 ENDIF
1289 IF (keep(110).NE.0) THEN
1290
1291 compute_anorminf = .true.
1292 ENDIF
1293 IF (
id%DKEEP(8).LT.zero)
THEN
1294
1295 IF (compute_anorminf) THEN
1296 eff_size_schur = 0
1298
1299 ELSE
1300 anorminf = zero
1301 ENDIF
1302 id%DKEEP(8) = abs(
id%DKEEP(8))*anorminf
1303
1304 IF ((keep(60).GT.0).AND.keep(116).GT.0) anorminf=zero
1305 ENDIF
1306
1307
1308
1309
1310 IF (compute_anorminf) THEN
1311 eff_size_schur = 0
1312 IF (keep(60).GT.0) eff_size_schur = keep(116)
1314 ELSE
1315 anorminf = zero
1316 ENDIF
1317
1318 IF ((keep(19).NE.0).OR.(keep(110).NE.0)) THEN
1319 IF (prokg) THEN
1320 IF (keep(19).NE.0) THEN
1321 WRITE(mpg,'(A,1PD16.4)')
1322 & ' CNTL(3) for null pivot rows/singularities =',cntl3
1323 ELSE
1324 WRITE(mpg,'(A,1PD16.4)')
1325 & ' CNTL(3) for null pivot row detection =',cntl3
1326 ENDIF
1327 ENDIF
1328 ENDIF
1329 IF (keep(19).EQ.0) THEN
1330
1331 seuil = zero
1333 ELSE
1334
1335
1336
1337
1338
1339
1340 IF (cntl3 .LT. zero) THEN
1341 id%DKEEP(9) = abs(cntl(3))
1342 ELSE IF (cntl3 .GT. zero) THEN
1343 id%DKEEP(9) = cntl3*anorminf
1344 ELSE
1345 ENDIF
1346 IF (prokg) THEN
1347 WRITE(mpg, '(A,I16)')
1348 & ' ICNTL(56) rank revealing effective value =',keep(19)
1349 WRITE(mpg,'(A,1PD16.4)')
1350 &
' ...Threshold for singularities on the root =',
id%DKEEP(9)
1351 ENDIF
1352
1353
1354
1355
1356 thresh_seuil =
id%DKEEP(13)
1357 IF (
id%DKEEP(13).LT.1) thresh_seuil = 10
1358 seuil =
id%DKEEP(9)*thresh_seuil
1359 IF (prokg) WRITE(mpg,'(A,1PD16.4)')
1360 & ' ...Threshold for postponing =',seuil
1361 ENDIF
1362 seuil_ldlt_niv2 = seuil
1363
1364
1365
1366 IF (keep(110).EQ.0) THEN
1367
1368
1369
1370
1371
1372 id%DKEEP(1) = -1.0d0
1374 ELSE
1375
1376 IF (keep(19).NE.0) THEN
1377
1378
1379
1380
1381 IF ((
id%DKEEP(10).LE.0).OR.(
id%DKEEP(10).GT.1))
THEN
1382
1383 id%DKEEP(1) =
id%DKEEP(9)*1d-1
1384 ELSE
1385 id%DKEEP(1) =
id%DKEEP(9)*
id%DKEEP(10)
1386 ENDIF
1387 ELSE
1388
1389
1390
1391 IF (cntl3 .LT. zero) THEN
1392 id%DKEEP(1) = abs(cntl(3))
1393 ELSE IF (cntl3 .GT. zero) THEN
1394 id%DKEEP(1) = cntl3*anorminf
1395 ELSE
1396
1398 & n, keep(28),
id%STEP(1),
id%FRERE_STEPS(1),
id%FILS(1),
1399 &
id%NA(1),
id%LNA,
id%NE_STEPS(1), npiv_critical_path )
1400 id%DKEEP(1) = sqrt(dble(npiv_critical_path))*eps*anorminf
1401 ENDIF
1402 ENDIF
1403 IF ((keep(110).NE.0).AND.(prokg)) THEN
1404 WRITE(mpg, '(A,I16)')
1405 & ' ICNTL(24) null pivot rows detection =',keep(110)
1406 WRITE(mpg,'(A,1PD16.4)')
1407 &
' ...Zero pivot detection threshold =',
id%DKEEP(1)
1408 ENDIF
1409 IF (cntl5.GT.zero) THEN
1410 id%DKEEP(2) = cntl5 * anorminf
1411 IF (prokg) WRITE(mpg,'(A,1PD10.3)')
1412 &
' ...Fixation for null pivots =',
id%DKEEP(2)
1413 ELSE
1414 IF (prokg) WRITE(mpg,*) '...Infinite fixation '
1415 IF (
id%KEEP(50).EQ.0)
THEN
1416
1417
1418
1419 id%DKEEP(2) = -
max(1.0d10*anorminf,
1420 & sqrt(huge(anorminf))/1.0d8)
1421 ELSE
1422
1424 ENDIF
1425 ENDIF
1426 ENDIF
1427
1428 IF (keep(53).NE.0) THEN
1431 IF ( keep( 46 ) .NE. 1 ) THEN
1432 id_root = id_root + 1
1433 END IF
1434 ENDIF
1435
1436
1437 lpn_list = 1
1438 IF (
associated(
id%PIVNUL_LIST) )
DEALLOCATE(
id%PIVNUL_LIST)
1439 IF(keep(110) .EQ. 1) THEN
1440 lpn_list = n
1441 ENDIF
1442 IF (keep(19).NE.0 .AND.
1443 & (id_root.EQ.
id%MYID .OR.
id%MYID.EQ.master))
THEN
1444 lpn_list = n
1445 ENDIF
1446 ALLOCATE(
id%PIVNUL_LIST(lpn_list),stat = ierr )
1447 IF ( ierr .GT. 0 ) THEN
1450 END IF
1451 id%PIVNUL_LIST(1:lpn_list) = 0
1452 keep(109) = 0
1453
1455 &
id%COMM,
id%MYID )
1456 IF (
id%INFO(1).lt.0 )
GOTO 517
1457
1458
1459
1460
1461 keep(97) = 0
1462 IF ((keep(19).EQ.0).AND.(keep(110).EQ.0)) THEN
1463 IF (
id%MYID .EQ. master) cntl4 =
id%CNTL(4)
1464 CALL mpi_bcast( cntl4, 1, mpi_double_precision,
1465 & master,
id%COMM, ierr )
1466
1467 IF ( cntl4 .GE. zero ) THEN
1468 keep(97) = 1
1469 IF ( cntl4 .EQ. zero ) THEN
1470
1471 IF(anorminf .EQ. zero) THEN
1472 eff_size_schur = 0
1473 IF (keep(60).GT.0) eff_size_schur = keep(116)
1475 & eff_size_schur )
1476 ENDIF
1477 seuil = sqrt(eps) * anorminf
1478 ELSE
1479 seuil = cntl4
1480 ENDIF
1481 seuil_ldlt_niv2 = seuil
1482 ELSE
1483 seuil = zero
1484 ENDIF
1485 ENDIF
1486
1487
1488
1489 keep(98) = 0
1490 keep(103) = 0
1491 keep(105) = 0
1492 maxs = 1_8
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1508 & maxs_base8, maxs_base_relaxed8,
1509 & blr_strat,
1510 &
id%KEEP(1),
id%KEEP8(1))
1511
1512 maxs = maxs_base_relaxed8
1513 IF (wk_user_provided) THEN
1514
1516 ENDIF
1518 &
id%COMM,
id%MYID )
1519 IF (
id%INFO(1) .LT. 0)
THEN
1520 GOTO 517
1521 ENDIF
1522
1523 id%KEEP8(75) = huge(
id%KEEP8(75))
1524 id%KEEP8(76) = huge(
id%KEEP8(76))
1525 IF (i_am_slave) THEN
1526
1527 IF (
id%KEEP8(4) .NE. 0_8)
THEN
1528
1529 IF ( .NOT. wk_user_provided ) THEN
1530
1532 & maxs,
1533 & blr_strat,
id%KEEP(201), maxs_base_relaxed8,
1534 &
id%KEEP(1),
id%KEEP8(1),
id%MYID,
id%N,
id%NELT,
1535 &
id%NA(1),
id%LNA,
id%NSLAVES,
1536 & keep464copy, keep465copy,
1537 &
id%INFO(1),
id%INFO(2)
1538 & ,
id%I8_L0_OMP(1,1),
size(
id%I8_L0_OMP,1),
1539 &
size(
id%I8_L0_OMP,2)
1540 & )
1541
1542
1543
1546 & .false.,
1547 & n,
id%NELT,
id%NA(1),
id%LNA,
id%NSLAVES,
1548 & blr_strat,
id%KEEP(201),
1549 &
id%KEEP,
id%KEEP8,
id%INFO(1),
id%INFO(2)
1550 & ,
id%I8_L0_OMP(1,1),
size(
id%I8_L0_OMP,1),
1551 &
size(
id%I8_L0_OMP,2)
1552 & )
1553 ELSE
1554
1557 & .false.,
1558 & n,
id%NELT,
id%NA(1),
id%LNA,
id%NSLAVES,
1559 & blr_strat,
id%KEEP(201),
1560 &
id%KEEP,
id%KEEP8,
id%INFO(1),
id%INFO(2)
1561 & ,
id%I8_L0_OMP(1,1),
size(
id%I8_L0_OMP,1),
1562 &
size(
id%I8_L0_OMP,2)
1563 & )
1564 ENDIF
1565 IF (keep(400) .GT.0) THEN
1566
1567
1568
1569
1570
1571 id%KEEP8(76) =
id%KEEP8(75)
1573 & 0_8,
1575 & .true.,
1576 &
id%N,
id%NELT,
id%NA(1),
id%LNA,
id%NSLAVES,
1577 & blr_strat,
id%KEEP(201),
1578 &
id%KEEP,
id%KEEP8,
id%INFO(1),
id%INFO(2)
1579 & ,
id%I8_L0_OMP(1,1),
size(
id%I8_L0_OMP,1),
1580 &
size(
id%I8_L0_OMP,2)
1581 & )
1582
1583
1584
1585
1586 ENDIF
1587 ENDIF
1588
1589 ENDIF
1590
1591 IF (i_am_slave) THEN
1592 IF ( (keep(400).GT.0) .AND. (keep(406).EQ.2) ) THEN
1593
1594
1597 &
id%NELT,
id%NA(1),
id%LNA,
id%NSLAVES,
1598 & blr_strat,
id%KEEP(201),
1599 &
id%KEEP(1),
id%KEEP8(1),
id%INFO(1),
id%INFO(2)
1600 & ,
id%I8_L0_OMP(1,1),
size(
id%I8_L0_OMP,1),
1601 &
size(
id%I8_L0_OMP,2)
1602 & )
1603 ENDIF
1604 ENDIF
1605
1607 &
id%COMM,
id%MYID )
1608 IF (
id%INFO(1) .LT. 0)
THEN
1609 GOTO 517
1610 ENDIF
1613 & print_maxavg,
1614 &
id%COMM,
" Effective size of S (based on INFO(39))= ")
1615
1616 IF ( i_am_slave ) THEN
1617
1618
1619
1621 & keep(64),
id%DKEEP(15), keep(375), maxs )
1622 k28=keep(28)
1623 memory_md_arg =
min(int(perlu,8) * ( maxs_base8 / 100_8 + 1_8 ),
1624
1625
1626
1627 &
max(0_8, maxs-maxs_base8))
1629
1630
1631
1632
1633
1635 IF (ierr < 0) THEN
1638 GOTO 112
1639 ENDIF
1640 IF (keep(201) .GT. 0) THEN
1641
1642
1643
1644 IF (keep(201).EQ.1
1645 & .AND.keep(50).EQ.0
1646 & .AND.keep(251).NE.2
1647 & ) THEN
1648 id%OOC_NB_FILE_TYPE=2
1649 ELSE
1650 id%OOC_NB_FILE_TYPE=1
1651 ENDIF
1652
1653
1654
1655 IF (keep(205) .GT. 0) THEN
1656 keep(100) = keep(205)
1657 ELSE
1658 IF (keep(201).EQ.1) THEN
1659 i8tmp = int(
id%OOC_NB_FILE_TYPE,8) *
1660 & 2_8 * int(keep(226),8)
1661 ELSE
1662 i8tmp = 2_8 *
id%KEEP8(119)
1663 ENDIF
1664 i8tmp = i8tmp + int(
max(keep(12),0),8) *
1665 & (i8tmp/100_8+1_8)
1666
1667
1668 i8tmp =
min(i8tmp, 12000000_8)
1669 keep(100)=int(i8tmp)
1670 ENDIF
1671 IF (keep(201).EQ.1) THEN
1672
1673 IF ( keep(99) < 3 ) THEN
1674 keep(99) = keep(99) + 3
1675 ENDIF
1676 ENDIF
1677
1678
1679
1680
1681 IF (keep(99) .LT.3) keep(100)=0
1682 IF((dble(keep(100))*dble(keep(35))/dble(2)).GT.
1683 & (dble(1999999999)))THEN
1684 IF (prokg) THEN
1685 WRITE(mpg,*)
id%MYID,
': Warning: DIM_BUF_IO might be
1686 & too big for Filesystem'
1687 ENDIF
1688 ENDIF
1689 ALLOCATE (
id%OOC_INODE_SEQUENCE(keep(28),
1690 &
id%OOC_NB_FILE_TYPE),
1691 & stat=ierr)
1692 IF ( ierr .GT. 0 ) THEN
1694 id%INFO(2) =
id%OOC_NB_FILE_TYPE*keep(28)
1695 NULLIFY(
id%OOC_INODE_SEQUENCE)
1696 GOTO 112
1697 ENDIF
1698 ALLOCATE (
id%OOC_TOTAL_NB_NODES(
id%OOC_NB_FILE_TYPE),
1699 & stat=ierr)
1700 IF ( ierr .GT. 0 ) THEN
1702 id%INFO(2) =
id%OOC_NB_FILE_TYPE
1703 NULLIFY(
id%OOC_TOTAL_NB_NODES)
1704 GOTO 112
1705 ENDIF
1706 ALLOCATE (
id%OOC_SIZE_OF_BLOCK(keep(28),
1707 &
id%OOC_NB_FILE_TYPE),
1708 & stat=ierr)
1709 IF ( ierr .GT. 0 ) THEN
1711 id%INFO(2) =
id%OOC_NB_FILE_TYPE*keep(28)
1712 NULLIFY(
id%OOC_SIZE_OF_BLOCK)
1713 GOTO 112
1714 ENDIF
1715 ALLOCATE (
id%OOC_VADDR(keep(28),
id%OOC_NB_FILE_TYPE),
1716 & stat=ierr)
1717 IF ( ierr .GT. 0 ) THEN
1719 id%INFO(2) =
id%OOC_NB_FILE_TYPE*keep(28)
1720 NULLIFY(
id%OOC_VADDR)
1721 GOTO 112
1722 ENDIF
1723 ENDIF
1724 ENDIF
1726 &
id%COMM,
id%MYID )
1727 IF (
id%INFO(1) < 0)
THEN
1728
1729 GOTO 513
1730 ENDIF
1731 IF (i_am_slave) THEN
1732 IF (keep(201) .GT. 0) THEN
1733 IF ((keep(201).EQ.1).OR.(keep(201).EQ.2)) THEN
1735 ELSE
1736 WRITE(*,*) "Internal error in DMUMPS_FAC_DRIVER"
1738 ENDIF
1739 IF(
id%INFO(1).LT.0)
THEN
1740 GOTO 111
1741 ENDIF
1742 ENDIF
1743
1744
1745
1747 &
id%KEEP(1),
id%KEEP8(1))
1748 IF (
id%INFO(1).LT.0)
GOTO 111
1749 END IF
1750
1751
1752
1753 earlyt3rootins = keep(200) .EQ.0
1754 & .OR. ( keep(200) .LT. 0 .AND. keep(400) .EQ. 0 )
1755#if defined (LARGEMATRICES)
1756 IF (
id%MYID .ne. master )
THEN
1757#endif
1758 IF (.NOT.wk_user_provided) THEN
1759 IF ( earlyt3rootins ) THEN
1760
1761 ALLOCATE (
id%S(maxs),stat=ierr)
1763 IF ( ierr .GT. 0 ) THEN
1766
1767
1768
1771 ENDIF
1772 ENDIF
1773 ELSE
1774 id%S =>
id%WK_USER(1:
id%KEEP8(24))
1776 ENDIF
1777#if defined (LARGEMATRICES)
1778 END IF
1779#endif
1780
1782 &
id%COMM,
id%MYID )
1783 IF (
id%INFO(1).LT.0 )
GOTO 514
1784
1785
1786
1787
1788 nb_active_fronts_estim = 3
1789 nb_threads = 1
1790
1791
1792 nb_active_fronts_estim = 3*nb_threads
1793 IF (i_am_slave) THEN
1794
1796
1797 IF ( (keep(486).EQ.2)
1798 & .OR. ((keep(489).NE.0).AND.(keep(400).GT.1))
1799 & ) THEN
1800
1801
1802
1803 nb_fronts_f_estim = keep(470)
1804 ELSE
1805 IF (keep(489).NE.0) THEN
1806
1807
1808
1809 nb_fronts_f_estim = 2*nb_active_fronts_estim
1810 ELSE
1811 nb_fronts_f_estim = nb_active_fronts_estim
1812 ENDIF
1813 ENDIF
1815 IF (
id%INFO(1) .LT. 0 )
GOTO 114
1816#if ! defined(NO_FDM_DESCBAND)
1817
1819#endif
1820#if ! defined(NO_FDM_MAPROW)
1821
1823#endif
1825 114 CONTINUE
1826 ENDIF
1828 &
id%COMM,
id%MYID )
1829
1830 IF (
id%INFO(1).LT.0 )
GOTO 500
1831
1832
1833
1834
1835
1836
1837
1838
1839 IF ( keep(55) .eq. 0 ) THEN
1840
1841
1842
1843
1844
1845 IF (
associated(
id%DBLARR))
THEN
1846 DEALLOCATE(
id%DBLARR)
1848 ENDIF
1849 IF ( i_am_slave .and.
id%KEEP8(26) .ne. 0_8 )
THEN
1850 ALLOCATE(
id%DBLARR(
id%KEEP8(26) ), stat = ierr )
1851 ELSE
1852 ALLOCATE(
id%DBLARR( 1 ), stat =ierr )
1853 END IF
1854 IF ( ierr .NE. 0 ) THEN
1855 IF (lpok) THEN
1856 WRITE(lp,*)
id%MYID,
1857 &
': Allocation error for DBLARR(',
id%KEEP8(26),
')'
1858 ENDIF
1862 GOTO 100
1863 END IF
1864 ELSE
1865
1866
1867
1868 IF (
associated(
id%INTARR ) )
THEN
1869 DEALLOCATE(
id%INTARR )
1870 NULLIFY(
id%INTARR )
1871 END IF
1872 IF ( i_am_slave .and.
id%KEEP8(27) .ne. 0_8 )
THEN
1873 ALLOCATE(
id%INTARR(
id%KEEP8(27) ), stat = allocok )
1874 IF ( allocok .GT. 0 ) THEN
1878 GOTO 100
1879 END IF
1880 ELSE
1881 ALLOCATE(
id%INTARR(1),stat=allocok )
1882 IF ( allocok .GT. 0 ) THEN
1886 GOTO 100
1887 END IF
1888 END IF
1889
1890
1891
1892
1893
1894 IF (
associated(
id%DBLARR))
THEN
1895 DEALLOCATE(
id%DBLARR)
1897 ENDIF
1898 IF ( i_am_slave ) THEN
1899 IF (
id%MYID_NODES .eq. master
1900 & .AND. keep(46) .eq. 1
1901 & .AND. keep(52) .eq. 0 ) THEN
1902
1903
1904
1905 id%DBLARR =>
id%A_ELT
1906 ELSE
1907
1908
1909
1910 IF (
id%KEEP8(26) .ne. 0_8 )
THEN
1911 ALLOCATE(
id%DBLARR(
id%KEEP8(26) ), stat = allocok )
1912 IF ( allocok .GT. 0 ) THEN
1916 GOTO 100
1917 END IF
1918 ELSE
1919 ALLOCATE(
id%DBLARR(1), stat = allocok )
1920 IF ( allocok .GT. 0 ) THEN
1924 GOTO 100
1925 END IF
1926 END IF
1927 END IF
1928 ELSE
1929 ALLOCATE(
id%DBLARR(1), stat = allocok )
1930 IF ( allocok .GT. 0 ) THEN
1934 GOTO 100
1935 END IF
1936 END IF
1937 END IF
1938
1939
1940
1941
1942 IF ( keep(38).NE.0 .AND. i_am_slave ) THEN
1944 &
id%root,
id%FILS(1), keep(38),
id%KEEP(1),
id%INFO(1) )
1945 END IF
1946
1947
1948 100 CONTINUE
1949
1950
1951
1953 &
id%COMM,
id%MYID )
1954 IF (
id%INFO(1).LT.0 )
GOTO 500
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1966
1967
1968
1969
1970
1971
1972 IF (earlyt3rootins) THEN
1974 maxs_arg = maxs
1975 ELSE
1976 s_ptr_arg => s_dummy_arg
1977 maxs_arg = 1
1978 ENDIF
1979
1980 IF ( keep( 55 ) .eq. 0 ) THEN
1981
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 IF (earlyt3rootins .AND. keep(38).NE.0 .AND.
2007 & keep(60) .EQ.0 .AND. i_am_slave) THEN
2008 lwk = int(
numroc(
id%root%ROOT_SIZE,
id%root%MBLOCK,
2009 &
id%root%MYROW, 0,
id%root%NPROW ),8)
2010 lwk =
max( 1_8, lwk )
2011 lwk = lwk*
2012 & int(
numroc(
id%root%ROOT_SIZE,
id%root%NBLOCK,
2013 &
id%root%MYCOL, 0,
id%root%NPCOL ),8)
2014 lwk =
max( 1_8, lwk )
2015 ELSE
2016 lwk = 1_8
2017 ENDIF
2018
2019
2020
2021 IF (maxs .LT. int(lwk,8)) THEN
2024 ENDIF
2026 &
id%COMM,
id%MYID )
2027 IF (
id%INFO(1).LT.0 )
GOTO 500
2028
2029 IF ( keep(54) .eq. 0 ) THEN
2030
2031
2032
2033
2034
2035 IF (
id%MYID .eq. master )
THEN
2036 ALLOCATE(iwk(
id%N), stat=allocok)
2037 IF ( allocok .NE. 0 ) THEN
2040 END IF
2041#if defined(LARGEMATRICES)
2042 ALLOCATE (wk(lwk),stat=ierr)
2043 IF ( ierr .GT. 0 ) THEN
2046 write(6,*) ' PB1 ALLOC LARGEMAT'
2047 ENDIF
2048#endif
2049 ENDIF
2051 &
id%COMM,
id%MYID )
2052 IF (
id%INFO(1).LT.0 )
GOTO 500
2053 IF (
id%MYID .eq. master )
THEN
2054
2055
2056
2057
2058
2059
2060
2061
2062 IF ( .not.
associated(
id%INTARR ) )
THEN
2063 ALLOCATE(
id%INTARR( 1 ),stat=ierr)
2064 IF ( ierr .GT. 0 ) THEN
2068 write(6,*) ' PB2 ALLOC INTARR'
2070 ENDIF
2071 ENDIF
2072 nbrecords = keep(39)
2073 IF (
id%KEEP8(28) .LT. int(nbrecords,8))
THEN
2074 nbrecords = int(
id%KEEP8(28))
2075 ENDIF
2076#if defined(LARGEMATRICES)
2078 &
id%IRN(1),
id%JCN(1),
id%SYM_PERM(1),
2079 & lscal,
id%COLSCA(1),
id%ROWSCA(1),
2080 &
id%MYID,
id%NSLAVES,
id%PROCNODE_STEPS(1),
2081 & nbrecords,
2082 & lp,
id%COMM,
id%root, keep,
id%KEEP8,
2083 &
id%FILS(1), iwk(1),
2084 &
2085 &
id%INTARR(1),
id%KEEP8(27),
id%DBLARR(1),
id%KEEP8(26),
2086 &
id%PTRAR(1),
id%PTRAR(
id%N+1),
2087 &
id%FRERE_STEPS(1),
id%STEP(1), wk(1), lwk,
2088 &
id%ISTEP_TO_INIV2(1),
id%I_AM_CAND(1),
2089 &
id%CANDIDATES(1,1))
2090
2097 IF (.NOT.wk_user_provided) THEN
2098 IF (earlyt3rootins) THEN
2099 ALLOCATE (
id%S(maxs),stat=ierr)
2101 IF ( ierr .GT. 0 ) THEN
2106 write(6,*) ' PB2 ALLOC LARGEMAT',maxs
2108 ENDIF
2109 ENDIF
2110 ENDIF
2111 ELSE
2112 id%S =>
id%WK_USER(1:
id%KEEP8(24))
2113 ENDIF
2114 IF (earlyt3rootins) THEN
2115 id%S(maxs-lwk+1_8:maxs) = wk(1_8:lwk)
2116 ENDIF
2117 DEALLOCATE (wk)
2118#else
2120 &
id%IRN(1),
id%JCN(1),
id%SYM_PERM(1),
2121 & lscal,
id%COLSCA(1),
id%ROWSCA(1),
2122 &
id%MYID,
id%NSLAVES,
id%PROCNODE_STEPS(1),
2123 & nbrecords,
2124 & lp,
id%COMM,
id%root, keep(1),
id%KEEP8(1),
2125 &
id%FILS(1), iwk(1),
2126 &
2127 &
id%INTARR(1),
id%KEEP8(27),
id%DBLARR(1),
id%KEEP8(26),
2128 &
id%PTRAR(1),
id%PTRAR(
id%N+1),
2129 &
id%FRERE_STEPS(1),
id%STEP(1), s_ptr_arg(1), maxs_arg,
2130 &
id%ISTEP_TO_INIV2(1),
id%I_AM_CAND(1),
2131 &
id%CANDIDATES(1,1) )
2132#endif
2133 DEALLOCATE(iwk)
2134 ELSE
2135 nbrecords = keep(39)
2136 IF (
id%KEEP8(28) .LT. int(nbrecords,8))
THEN
2137 nbrecords = int(
id%KEEP8(28))
2138 ENDIF
2140 &
id%DBLARR(1),
id%KEEP8(26),
2141 &
id%INTARR(1),
id%KEEP8(27),
2144 & keep( 1 ),
id%KEEP8(1),
id%MYID,
id%COMM,
2145 & nbrecords,
2146 &
2147 & s_ptr_arg(1), maxs_arg,
2149 &
id%PROCNODE_STEPS(1),
id%NSLAVES,
2150 &
id%SYM_PERM(1),
id%FRERE_STEPS(1),
id%STEP(1),
2151 &
id%INFO(1),
id%INFO(2) )
2152 ENDIF
2153 ELSE
2154
2155
2156
2157
2158
2159 IF (
id%MYID.EQ.master)
THEN
2161 END IF
2162 IF ( i_am_slave ) THEN
2163
2164
2165
2166
2167
2168
2169
2171 & mpi_max,
id%COMM_NODES, ierr)
2172 nbrecords = keep(39)
2173 IF (nz_locmax8 .LT. int(nbrecords,8)) THEN
2174 nbrecords = int(nz_locmax8)
2175 ENDIF
2179 &
id%DBLARR(1),
id%KEEP8(26),
id%INTARR(1),
2180 &
id%KEEP8(27),
id%PTRAR(1),
id%PTRAR(
id%N+1),
2181 & keep(1),
id%KEEP8(1),
id%MYID_NODES,
2182 &
id%COMM_NODES, nbrecords,
2183 & s_ptr_arg(1), maxs_arg,
id%root,
id%PROCNODE_STEPS(1),
2184 &
id%NSLAVES,
id%SYM_PERM(1),
id%STEP(1),
2185 &
id%ICNTL(1),
id%INFO(1), nsend8, nlocal8,
2186 &
id%ISTEP_TO_INIV2(1),
2187 &
id%CANDIDATES(1,1) )
2188 IF ( ( keep(52).EQ.7 ).OR. (keep(52).EQ.8) ) THEN
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201 IF (
id%MYID > 0 )
THEN
2202 IF (
associated(
id%ROWSCA))
THEN
2203 DEALLOCATE(
id%ROWSCA)
2205 ENDIF
2206 IF (
associated(
id%COLSCA))
THEN
2207 DEALLOCATE(
id%COLSCA)
2209 ENDIF
2210 ENDIF
2211 ENDIF
2212#if defined(LARGEMATRICES)
2213
2214
2215
2216 IF (
associated(
id%IRN_loc))
THEN
2217 DEALLOCATE(
id%IRN_loc)
2219 ENDIF
2220 IF (
associated(
id%JCN_loc))
THEN
2221 DEALLOCATE(
id%JCN_loc)
2223 ENDIF
2224 IF (
associated(
id%A_loc))
THEN
2225 DEALLOCATE(
id%A_loc)
2227 ENDIF
2228 write(6,*) ' Warning :',
2229 & ' id%A_loc, IRN_loc, JCN_loc deallocated !!! '
2230#endif
2231 IF (prok) THEN
2232 WRITE(mp,120) nlocal8, nsend8
2233 END IF
2234 END IF
2235 IF ( keep(46) .eq. 0 .AND.
id%MYID.eq.master )
THEN
2236
2237
2238
2239
2240 nsend8 = 0_8
2241 nlocal8 = 0_8
2242 END IF
2243
2244
2245
2246 CALL mpi_reduce( nsend8, nsend_tot8, 1, mpi_integer8,
2247 & mpi_sum, master,
id%COMM, ierr )
2248 CALL mpi_reduce( nlocal8, nlocal_tot8, 1, mpi_integer8,
2249 & mpi_sum, master,
id%COMM, ierr )
2250 IF ( prokg ) THEN
2251 WRITE(mpg,125) nlocal_tot8, nsend_tot8
2252 END IF
2253
2254
2255
2256
2258 &
id%COMM,
id%MYID )
2259 IF (
id%INFO( 1 ) .LT. 0 )
GOTO 500
2260
2261 ENDIF
2262 ELSE
2263
2264
2265
2266
2267
2268 IF (
id%MYID.eq.master)
2271 & maxelt_size )
2272
2273
2274
2275
2276
2277
2278
2281 &
id%NSLAVES,
id%PTRAR(1),
2282 &
id%PTRAR(
id%NELT+2),
2283 &
id%INTARR(1),
id%DBLARR(1),
id%KEEP8(27),
id%KEEP8(26),
2284 &
id%KEEP(1),
id%KEEP8(1), maxelt_size,
2285 &
id%FRTPTR(1),
id%FRTELT(1),
2286 & s_ptr_arg(1), maxs_arg,
id%FILS(1),
2288
2289
2290
2292 &
id%COMM,
id%MYID )
2293 IF (
id%INFO( 1 ) .LT. 0 )
GOTO 500
2294 END IF
2295
2296
2297
2298 IF (
id%MYID.EQ.master)
THEN
2301 IF (prokg)
WRITE(mpg,160)
id%DKEEP(93)
2302 END IF
2303 IF ( keep(400) .GT. 0 ) THEN
2304
2305
2306
2307 nomp=1
2308
2309 IF ( nomp .NE. keep(400) ) THEN
2311 id%INFO(2)=keep(400)
2312 IF (lpok) WRITE(lp,'(A,A,I5,A,I5)')
2313 &" FAILURE DETECTED IN FACTORIZATION: #threads for KEEP(401)",
2314 &" changed from",keep(400)," at analysis to", nomp
2315 ENDIF
2316
2318 &
id%COMM,
id%MYID )
2319 IF (
id%INFO( 1 ) .LT. 0 )
GOTO 500
2320 ENDIF
2321
2322
2323
2325
2326
2327
2328
2329 IF ( i_am_slave ) THEN
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346 IF (keep(486).NE.0) THEN
2347 dmumps_lbufr_bytes8 = int(keep( 380 ),8) * int(keep( 35 ),8)
2348 ELSE
2349 dmumps_lbufr_bytes8 = int(keep( 44 ),8) * int(keep( 35 ),8)
2350 ENDIF
2351
2352
2353
2354 dmumps_lbufr_bytes8 =
max( dmumps_lbufr_bytes8,
2355 & 100000_8 )
2356 IF ((keep(50).NE.0).AND.(keep(489).GT.0).AND.
2357 & (
id%NSLAVES.GE.2))
THEN
2358
2359
2360
2361
2362 ratiok465 = dble(keep465copy)/dble(1000)
2363 dmumps_lbufr_bytes8 =
max(dmumps_lbufr_bytes8,
2364 & int(
2365 & ratiok465*
2366 & dble(
2367 & int(keep(2)+1,8)*int(keep(142),8)*int(keep(35),8)
2368 & )
2369 & ,8)
2370 & )
2371 ENDIF
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389 IF (keep(48).EQ.5) THEN
2390 min_perlu = 2
2391 ELSE
2392 min_perlu = 0
2393 ENDIF
2394
2395 dmumps_lbufr_bytes8 = dmumps_lbufr_bytes8
2396 & + int( 2.0d0 * dble(
max(perlu,min_perlu))*
2397 & dble(dmumps_lbufr_bytes8)/100d0, 8)
2398 dmumps_lbufr_bytes8 =
min(dmumps_lbufr_bytes8,
2399 & int(huge(i4)-100,8))
2400 dmumps_lbufr_bytes = int( dmumps_lbufr_bytes8 )
2401 IF (keep(48)==5) THEN
2402
2403
2404
2405
2406 id%KEEP8(21) =
id%KEEP8(22) +
2407 & int( dble(
max(perlu,min_perlu))*
2408 & dble(
id%KEEP8(22))/100d0,8)
2409 ENDIF
2410
2411
2412
2413
2414
2415
2416
2417
2418 IF (keep(486).NE.0) THEN
2419 dmumps_lbuf8 = int( dble(keep(213)) / 100.0d0 *
2420 & dble(keep(379)) * dble(keep(35)), 8 )
2421 ELSE
2422 dmumps_lbuf8 = int( dble(keep(213)) / 100.0d0 *
2423 & dble(keep(43)) * dble(keep(35)), 8 )
2424 ENDIF
2425 dmumps_lbuf8 =
max( dmumps_lbuf8, 100000_8 )
2426 dmumps_lbuf8 = dmumps_lbuf8
2427 & + int( 2.0d0 * dble(
max(perlu,min_perlu))*
2428 & dble(dmumps_lbuf8)/100d0, 8)
2429
2430 dmumps_lbuf8 =
min(dmumps_lbuf8, int(huge(i4)-100,8))
2431
2432
2433
2434
2435 dmumps_lbuf8 =
max(dmumps_lbuf8, dmumps_lbufr_bytes8+3*keep(34))
2436 dmumps_lbuf = int(dmumps_lbuf8)
2437 IF(
id%KEEP(48).EQ.4)
THEN
2438 dmumps_lbufr_bytes=dmumps_lbufr_bytes*5
2439 dmumps_lbuf=dmumps_lbuf*5
2440 ENDIF
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451 dmumps_lbuf_int = ( keep(56) +
id%NSLAVES *
id%NSLAVES ) * 5
2452 & * keep(34)
2453 IF ( keep( 38 ) .NE. 0 ) THEN
2454
2455
2458 IF ( kkkk .EQ.
id%MYID_NODES )
THEN
2459 dmumps_lbuf_int = dmumps_lbuf_int + 4 * keep(34) *
2460 & (
id%NSLAVES +
id%NE_STEPS(
id%STEP(keep(38)))
2461 & +
min(keep(56),
id%NE_STEPS(
id%STEP(keep(38)))) *
id%NSLAVES
2462 & )
2463 END IF
2464 END IF
2465
2466
2467
2468 IF ( prok ) THEN
2469 WRITE( mp, 9999 ) dmumps_lbufr_bytes,
2470 & dmumps_lbuf, dmumps_lbuf_int
2471 END IF
2472 9999 FORMAT( /,' Allocated buffers',/,' ------------------',/,
2473 & ' Size of reception buffer in bytes ...... = ', i10,
2474 & /,
2475 & ' Size of async. emission buffer (bytes).. = ', i10,/,
2476 & ' Small emission buffer (bytes) .......... = ', i10)
2477
2478
2479
2480
2482 IF ( ierr .NE. 0 ) THEN
2484
2485 id%INFO(2)= (dmumps_lbuf_int+keep(34)-1)/keep(34)
2486 IF (lpok) THEN
2487 WRITE(lp,*)
id%MYID,
2488 & ':Allocation error in DMUMPS_BUF_ALLOC_SMALL_BUF'
2490 ENDIF
2491 GO TO 110
2492 END IF
2493
2494
2495
2496
2497
2498 dmumps_lbufr = (dmumps_lbufr_bytes+keep(34)-1)/keep(34)
2499 ALLOCATE( bufr( dmumps_lbufr ),stat=ierr )
2500 IF ( ierr .NE. 0 ) THEN
2502 id%INFO(2) = dmumps_lbufr
2503 IF (lpok) THEN
2504 WRITE(lp,*)
2505 & ': Allocation error for BUFR(', dmumps_lbufr,
2506 &
') on MPI process',
id%MYID
2507 ENDIF
2508 GO TO 110
2509 END IF
2510
2511
2512
2513
2514
2515
2516 perlu = keep( 12 )
2517 IF (keep(201).GT.0) THEN
2518
2519
2520 maxis_estim = keep(225)
2521 ELSE
2522
2523 maxis_estim = keep(15)
2524 ENDIF
2525 maxis =
max( 1, int(
min( int(huge(maxis),8),
2526 & int(maxis_estim,8) + 3_8 *
max(int(perlu,8),10_8) *
2527 & ( int(maxis_estim,8) / 100_8 + 1_8 )
2528 & )
2529 & )
2530 & )
2531
2532
2533
2534
2535
2536
2537
2538 ALLOCATE(
id%PTLUST_S(
id%KEEP(28) ), stat = ierr )
2539 IF ( ierr .NE. 0 ) THEN
2541 id%INFO(2)=
id%KEEP(28)
2542 IF (lpok) THEN
2543 WRITE(lp,*)
id%MYID,
2544 &
': Allocation error for id%PTLUST_S(',
id%KEEP(28),
')'
2545 ENDIF
2546 NULLIFY(
id%PTLUST_S)
2547 GOTO 110
2548 END IF
2549 ALLOCATE(
id%PTRFAC(
id%KEEP(28) ), stat = ierr )
2550 IF ( ierr .NE. 0 ) THEN
2552 id%INFO(2)=
id%KEEP(28)
2554 IF (lpok) THEN
2555 WRITE(lp,*)
id%MYID,
2556 &
': Allocation error for id%PTRFAC(',
id%KEEP(28),
')'
2557 ENDIF
2558 GOTO 110
2559 END IF
2560
2561
2562
2563
2564
2565
2566 ptrist = 1
2567 ptrwb = ptrist +
id%KEEP(28)
2568 itloc = ptrwb + 2 *
id%KEEP(28)
2569
2570 ipool = itloc +
id%N +
id%KEEP(253)
2571
2572
2573
2574
2575
2576
2577
2578
2580 ALLOCATE( iwk( ipool + lpool - 1 ), stat = ierr )
2581 IF ( ierr .NE. 0 ) THEN
2583 id%INFO(2)=ipool + lpool - 1
2584 IF (lpok) THEN
2585 WRITE(lp,*)
id%MYID,
2586 & ': Allocation error for IWK(',ipool+lpool-1,')'
2587 ENDIF
2588 GOTO 110
2589 END IF
2590 ALLOCATE(iwk8( 2 *
id%KEEP(28)), stat = ierr)
2591 IF ( ierr .NE. 0 ) THEN
2593 id%INFO(2)=2 *
id%KEEP(28)
2594 IF (lpok) THEN
2595 WRITE(lp,*)
id%MYID,
2596 &
': Allocation error for IWKB(', 2*
id%KEEP(28),
')'
2597 ENDIF
2598 GOTO 110
2599 END IF
2600
2601
2602
2603 ENDIF
2604
2605 110 CONTINUE
2606
2607
2608
2610 &
id%COMM,
id%MYID )
2611 IF (
id%INFO( 1 ) .LT. 0 )
GOTO 500
2612
2613 IF ( i_am_slave ) THEN
2614
2616 IF (prok) THEN
2617 WRITE( mp, 170 ) maxs, maxis,
id%KEEP8(12), keep(15),
2618 &
id%KEEP8(26),
id%KEEP8(27),
id%KEEP8(11), keep(26), keep(27)
2619 ENDIF
2620 END IF
2621
2622
2623
2624
2625
2626
2627
2628
2630
2631
2632
2634
2635
2638 rinfo(2:3)=zero
2639 IF ( i_am_slave ) THEN
2640
2641
2642
2643 IF ( keep(55) .eq. 0 ) THEN
2645 ELSE
2646 ldptrar =
id%NELT + 1
2647 END IF
2648 IF (
id%KEEP(55) .NE. 0 )
THEN
2650 ELSE
2651
2652
2653
2654
2655 nelt_arg = 1
2656 END IF
2657 ENDIF
2658 IF (i_am_slave) THEN
2659 IF (
associated(
id%L0_OMP_MAPPING))
2660 &
DEALLOCATE(
id%L0_OMP_MAPPING)
2661 IF (keep(400) .GT. 0) THEN
2662 id%LL0_OMP_MAPPING = keep(28)
2663 ELSE
2664 id%LL0_OMP_MAPPING = 1
2665 ENDIF
2666 ALLOCATE(
id%L0_OMP_MAPPING(
id%LL0_OMP_MAPPING), stat=allocok)
2667 IF ( allocok > 0) THEN
2668 write(*,*) "Problem allocating L0_OMP_MAPPING",
2669 & ierr, keep(28)
2670 GOTO 115
2671 ENDIF
2672 IF (
associated(
id%L0_OMP_FACTORS))
THEN
2674 ENDIF
2675 IF (keep(400) .GT. 0) THEN
2676 id%LL0_OMP_FACTORS = keep(400)
2677 ELSE
2678 id%LL0_OMP_FACTORS = 1
2679 ENDIF
2680 ALLOCATE(
id%L0_OMP_FACTORS(
id%LL0_OMP_FACTORS),stat = allocok)
2681 IF (allocok > 0) THEN
2683 id%INFO(2)=nb_threads
2684 GOTO 111
2685 ENDIF
2687 ENDIF
2688 115 CONTINUE
2690 &
id%COMM,
id%MYID )
2691 IF (
id%INFO( 1 ) .LT. 0 )
GOTO 500
2692
2693 avg_flops = rinfog(1)/(dble(
id%NSLAVES))
2694 id%DKEEP(17) =
max(
id%DKEEP(18), avg_flops/dble(50) )
2695 &
2696 IF (prok.AND.
id%MYID.EQ.master)
THEN
2697 IF (
id%NSLAVES.LE.1)
THEN
2698 WRITE(mp,'(/A,A,1PD10.3)')
2699 &' Start factorization with total',
2700 &' estimated flops (RINFOG(1)) = ',
2701 & rinfog(1)
2702 ELSE
2703 WRITE(mp,'(/A,A,1PD10.3,A,1PD10.3)')
2704 &' Start factorization with total',
2705 &' estimated flops RINFOG(1) / Average per MPI proc = ',
2706 & rinfog(1), ' / ', avg_flops
2707 ENDIF
2708 ENDIF
2709 IF (i_am_slave) THEN
2710
2711
2712
2713
2714
2715
2716
2717 s_is_pointers%IW =>
id%IS;
NULLIFY(
id%IS)
2718 s_is_pointers%A =>
id%S ;
NULLIFY(
id%S)
2720 &
id%NA(1),
id%LNA,
id%NE_STEPS(1),
id%ND_STEPS(1),
id%FILS(1),
2721 &
id%STEP(1),
id%FRERE_STEPS(1),
id%DAD_STEPS(1),
id%CANDIDATES(1,1),
2722 &
id%ISTEP_TO_INIV2(1),
id%TAB_POS_IN_PERE(1,1),
id%PTRAR(1),
2723 & ldptrar,iwk(ptrist),
id%PTLUST_S(1),
id%PTRFAC(1),iwk(ptrwb),iwk8,
2724 & iwk(itloc),rhs_mumps(1),iwk(ipool),lpool,cntl1,icntl(1),
2725 &
id%INFO(1), rinfo(1),keep(1),
id%KEEP8(1),
id%PROCNODE_STEPS(1),
2726 &
id%NSLAVES,
id%COMM_NODES,
id%MYID,
id%MYID_NODES,bufr,dmumps_lbufr
2727 & , dmumps_lbufr_bytes, dmumps_lbuf,
id%INTARR(1),
id%DBLARR(1),
2728 &
id%root, nelt_arg,
id%FRTPTR(1),
id%FRTELT(1),
id%COMM_LOAD,
2729 &
id%ASS_IRECV, seuil, seuil_ldlt_niv2,
id%MEM_DIST(0),
2730 &
id%DKEEP(1),
id%PIVNUL_LIST(1), lpn_list,
id%LRGROUPS(1)
2731 & ,
id%IPOOL_B_L0_OMP(1),
id%LPOOL_B_L0_OMP,
2732 &
id%IPOOL_A_L0_OMP(1),
id%LPOOL_A_L0_OMP,
id%L_VIRT_L0_OMP,
2733 &
id%VIRT_L0_OMP(1),
id%VIRT_L0_OMP_MAPPING(1),
id%L_PHYS_L0_OMP,
2734 &
id%PHYS_L0_OMP(1),
id%PERM_L0_OMP(1),
id%PTR_LEAFS_L0_OMP(1),
2735 &
id%L0_OMP_MAPPING(1),
id%LL0_OMP_MAPPING,
2736 &
id%THREAD_LA,
id%L0_OMP_FACTORS(1),
id%LL0_OMP_FACTORS,
2737 &
id%I4_L0_OMP(1,1),
size(
id%I4_L0_OMP,1),
size(
id%I4_L0_OMP,2),
2738 &
id%I8_L0_OMP(1,1),
size(
id%I8_L0_OMP,1),
size(
id%I8_L0_OMP,2)
2739 & )
2740 id%IS => s_is_pointers%IW;
NULLIFY(s_is_pointers%IW)
2741 id%S => s_is_pointers%A ;
NULLIFY(s_is_pointers%A)
2742
2743
2744
2745
2746 DEALLOCATE( iwk )
2747 DEALLOCATE( iwk8 )
2748 ENDIF
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758 IF ( keep(55) .eq. 0 ) THEN
2759
2760
2761
2762
2763 IF (
associated(
id%DBLARR))
THEN
2764 DEALLOCATE(
id%DBLARR)
2766 ENDIF
2767
2768 ELSE
2769
2770
2771
2772
2773 IF (
associated(
id%INTARR))
THEN
2774 DEALLOCATE(
id%INTARR)
2775 NULLIFY(
id%INTARR )
2776 ENDIF
2777
2778
2779
2780
2781
2782 IF (
id%MYID_NODES .eq. master
2783 & .AND. keep(46) .eq. 1
2784 & .AND. keep(52) .eq. 0 ) THEN
2785 NULLIFY(
id%DBLARR )
2786 ELSE
2787 IF (
associated(
id%DBLARR))
THEN
2788 DEALLOCATE(
id%DBLARR)
2790 ENDIF
2791 END IF
2792 END IF
2793
2794
2795
2796
2797
2798
2799
2800
2801 IF ( keep(19) .NE. 0 ) THEN
2802 IF ( keep(46) .NE. 1 ) THEN
2803
2804
2805 IF (
id%MYID .eq. master )
THEN
2806 CALL mpi_recv( keep(17), 1, mpi_integer, 1, defic_tag,
2807 &
id%COMM, status, ierr )
2808 CALL mpi_recv( keep(143), 1, mpi_integer, 1, defic_tag,
2809 &
id%COMM, status, ierr )
2810 ELSE IF (
id%MYID .EQ. 1 )
THEN
2811 CALL mpi_send( keep(17), 1, mpi_integer, 0, defic_tag,
2813 CALL mpi_send( keep(143), 1, mpi_integer, 0, defic_tag,
2815 END IF
2816 END IF
2817 END IF
2818
2819
2820
2821
2822
2823 IF (allocated(bufr)) DEALLOCATE(bufr)
2825
2826 IF (keep(219).NE.0) THEN
2828 ENDIF
2829
2830
2831
2832
2833
2835 &
id%COMM,
id%MYID )
2836
2838 IF (keep(201) .GT. 0) THEN
2839 IF ((keep(201).EQ.1) .OR. (keep(201).EQ.2)) THEN
2840 IF ( i_am_slave ) THEN
2842 IF(ierr.LT.0)THEN
2845 ENDIF
2846 ENDIF
2848 &
id%COMM,
id%MYID )
2849
2850
2851
2852
2853 END IF
2854 END IF
2855 IF (
id%MYID.EQ.master)
THEN
2858 IF (keep(400).GT.0) THEN
2859
2860 id%DKEEP(96)=
id%DKEEP(94)-
id%DKEEP(95)
2861 ENDIF
2862 ENDIF
2863
2864
2865
2866 mem_eff_allocated = .true.
2868 &
id%MYID, n,
id%NELT,
id%NA(1),
id%LNA,
id%KEEP8(28),
2870 &
id%NSLAVES, total_mbytes, .true.,
id%KEEP(201),
2871 & blr_strat, .true., total_bytes,
2872 & idummy, bdummy, mem_eff_allocated
2873 & , .false.
2874 & ,
id%I8_L0_OMP(1,1),
size(
id%I8_L0_OMP,1),
2875 &
size(
id%I8_L0_OMP,2)
2876 & )
2877 IF (keep(400) .GT. 0 ) THEN
2879 &
id%MYID, n,
id%NELT,
id%NA(1),
id%LNA,
id%KEEP8(28),
2881 &
id%NSLAVES, total_mbytes_under_l0, .true.,
id%KEEP(201),
2882 & blr_strat, .true., total_bytes_under_l0,
2883 & idummy, bdummy, mem_eff_allocated
2884 & , .true.
2885 & ,
id%I8_L0_OMP(1,1),
size(
id%I8_L0_OMP,1),
2886 &
size(
id%I8_L0_OMP,2)
2887 & )
2888 total_mbytes =
max(total_mbytes,total_mbytes_under_l0)
2889 total_bytes =
max(total_bytes, total_bytes_under_l0)
2890 ENDIF
2891 IF (
id%KEEP8(24).NE.0)
THEN
2892
2893
2894 id%INFO(16) = total_mbytes
2895 ELSE
2896
2897
2898
2899 id%INFO(16) = total_mbytes
2900 ENDIF
2901
2902
2903
2904
2905
2906
2907
2909 &
id%INFO(16),
id%INFOG(18), irank )
2911 & mp, mpg,
id%INFO(16),
id%INFOG(18),
id%INFOG(19),
2912 &
id%NSLAVES, irank,
2914
2915 IF (prok ) THEN
2916 WRITE(mp,'(A,I12) ')
2917 & ' ** Eff. min. Space MBYTES for facto (INFO(16)):',
2918 & total_mbytes
2919 ENDIF
2920
2921
2922
2923
2924 perlu_on = .true.
2925 mem_eff_allocated = .false.
2927 &
id%MYID, n,
id%NELT,
id%NA(1),
id%LNA,
id%KEEP8(28),
2929 &
id%NSLAVES, total_mbytes, .true.,
id%KEEP(201),
2930 & blr_strat, perlu_on, total_bytes,
2931 & idummy, bdummy, mem_eff_allocated
2932 & , .false.
2933 & ,
id%I8_L0_OMP(1,1),
size(
id%I8_L0_OMP,1),
2934 &
size(
id%I8_L0_OMP,2)
2935 & )
2936 IF (keep(400) .GT. 0 ) THEN
2938 &
id%MYID, n,
id%NELT,
id%NA(1),
id%LNA,
id%KEEP8(28),
2940 &
id%NSLAVES, total_mbytes_under_l0, .true.,
id%KEEP(201),
2941 & blr_strat, perlu_on, total_bytes_under_l0,
2942 & idummy, bdummy, mem_eff_allocated
2943 & , .true.
2944 & ,
id%I8_L0_OMP(1,1),
size(
id%I8_L0_OMP,1),
2945 &
size(
id%I8_L0_OMP,2)
2946 & )
2947 total_mbytes =
max(total_mbytes,total_mbytes_under_l0)
2948 total_bytes =
max(total_bytes, total_bytes_under_l0)
2949 ENDIF
2950
2951
2952
2953 id%KEEP8(7) = total_bytes
2954
2955
2956 id%INFO(22) = total_mbytes
2957
2958
2959
2960
2961
2962
2963
2965 &
id%INFO(22),
id%INFOG(21), irank )
2966 IF ( prokg ) THEN
2967 IF (print_maxavg) THEN
2968 WRITE( mpg,'(A,I12) ')
2969 & ' ** memory effectively
used,
max in mbytes(infog(21)):
',
2970 & id%INFOG(21)
2971 ENDIF
2972 WRITE( MPG,'(a,i12) ')
2973 & ' ** memory effectively
used, total in mbytes(infog(22)):
',
2974 & id%INFOG(22)
2975 END IF
2976 SUM_INFO22_THIS_NODE=0
2977 CALL MPI_REDUCE( id%INFO(22), SUM_INFO22_THIS_NODE, 1,
2978 & MPI_INTEGER,
2979 & MPI_SUM, 0, id%KEEP(411), IERR )
2980 CALL MPI_REDUCE( SUM_INFO22_THIS_NODE, MAX_SUM_INFO22_THIS_NODE,
2981 & 1, MPI_INTEGER, MPI_MAX, 0, id%COMM, IERR )
2982.AND. IF (PROKG PRINT_NODEINFO) THEN
2983 WRITE(MPG,'(a,i12)')
2984 & ' **
max. effective space per compute node, in mbytes :
',
2985 & MAX_SUM_INFO22_THIS_NODE
2986 ENDIF
2987
2988 IF (I_AM_SLAVE) THEN
2989 K67 = id%KEEP8(67)
2990 K68 = id%KEEP8(68)
2991 K70 = id%KEEP8(70)
2992 K74 = id%KEEP8(74)
2993 K75 = id%KEEP8(75)
2994 ELSE
2995 K67 = 0_8
2996 K68 = 0_8
2997 K70 = 0_8
2998 K74 = 0_8
2999 K75 = 0_8
3000 ENDIF
3001
3002
3003 CALL MUMPS_SETI8TOI4(K67,id%INFO(21))
3004
3005
3006.GT. IF (KEEP(400) 0 ) THEN
3007.NOT. IF ( I_AM_SLAVE) THEN
3008 id%DKEEP(95) = 0.0D0
3009 id%DKEEP(16) = 0.0D0
3010 ENDIF
3011.GT. IF (id%NPROCS 1) THEN
3012
3013 CALL MPI_REDUCE(id%DKEEP(95), TMPTIME, 1,
3014 & MPI_DOUBLE_PRECISION, MPI_SUM, MASTER, id%COMM, IERR)
3015.EQ. IF (id%MYIDMASTER) TIMEAVG = TMPTIME
3016 CALL MPI_REDUCE(id%DKEEP(16), TMPFLOP, 1,
3017 & MPI_DOUBLE_PRECISION, MPI_SUM, MASTER, id%COMM, IERR)
3018.EQ. IF (id%MYIDMASTER) FLOPAVG = TMPFLOP
3019.EQ. IF (id%MYIDMASTER) THEN
3020 TIMEAVG = TIMEAVG / id%NSLAVES
3021 FLOPAVG = FLOPAVG / id%NSLAVES
3022 ENDIF
3023 CALL MPI_REDUCE(id%DKEEP(95), TIMEMAX, 1,
3024 & MPI_DOUBLE_PRECISION, MPI_MAX, MASTER, id%COMM, IERR)
3025 CALL MPI_REDUCE(id%DKEEP(16), FLOPMAX, 1,
3026 & MPI_DOUBLE_PRECISION, MPI_MAX, MASTER, id%COMM, IERR)
3027
3028 IF ( PROKG ) THEN
3029 WRITE(MPG,190) FLOPAVG, FLOPMAX
3030 WRITE(MPG,188) TIMEAVG, TIMEMAX
3031 ENDIF
3032 ELSE
3033
3034 IF ( PROKG ) THEN
3035 WRITE(MPG,189) id%DKEEP(16)
3036 WRITE(MPG,187) id%DKEEP(95)
3037 ENDIF
3038 ENDIF
3039 ENDIF
3040 IF ( PROKG ) THEN
3041.GE. IF (id%INFO(1) 0) THEN
3042 WRITE(MPG,180) id%DKEEP(94)
3043 ELSE
3044 WRITE(MPG,185) id%DKEEP(94)
3045 ENDIF
3046 ENDIF
3047
3048
3049
3050
3051 RINFO(4) = RINFO(3)
3052
3053
3054
3055 CALL MPI_REDUCE( RINFO(2), RINFOG(2), 2,
3056 & MPI_DOUBLE_PRECISION,
3057 & MPI_SUM, MASTER, id%COMM, IERR)
3058
3059
3060 KEEP(247) = 0
3061 CALL MPI_REDUCE( KEEP(246), KEEP(247), 1, MPI_INTEGER,
3062 & MPI_MAX, MASTER, id%COMM, IERR)
3063
3064
3065 CALL MPI_REDUCE( id%DKEEP(97), id%DKEEP(98), 1,
3066 & MPI_DOUBLE_PRECISION,
3067 & MPI_MAX, MASTER, id%COMM, IERR)
3068
3069 CALL MPI_REDUCE( RINFO(2), RINFOG(2), 2,
3070 & MPI_DOUBLE_PRECISION,
3071 & MPI_SUM, MASTER, id%COMM, IERR)
3072 CALL MUMPS_REDUCEI8( id%KEEP8(31)+id%KEEP8(64),id%KEEP8(6),
3073 & MPI_SUM, MASTER, id%COMM )
3074
3075.EQ. IF (id%MYID0) THEN
3076
3077 RINFOG(16) = dble(id%KEEP8(6)*int(KEEP(35),8))/dble(1D6)
3078.LE. IF (KEEP(201)0) THEN
3079 RINFOG(16) = ZERO
3080 ENDIF
3081 ENDIF
3082 CALL MUMPS_REDUCEI8( id%KEEP8(48),id%KEEP8(148), MPI_SUM,
3083 & MASTER, id%COMM )
3084 CALL MUMPS_SETI8TOI4(id%KEEP8(148), INFOG(9))
3085
3086 CALL MPI_REDUCE( int(id%INFO(10),8), id%KEEP8(128),
3087 & 1, MPI_INTEGER8,
3088 & MPI_SUM, MASTER, id%COMM, IERR)
3089.EQ. IF (id%MYIDMASTER) THEN
3090 CALL MUMPS_SETI8TOI4(id%KEEP8(128), id%INFOG(10))
3091 ENDIF
3092
3093 CALL MPI_ALLREDUCE( id%INFO(11), INFOG(11), 1, MPI_INTEGER,
3094 & MPI_MAX, id%COMM, IERR)
3095
3096
3097
3098 KEEP(133) = INFOG(11)
3099 CALL MPI_REDUCE( id%INFO(12), INFOG(12), 3, MPI_INTEGER,
3100 & MPI_SUM, MASTER, id%COMM, IERR)
3101 CALL MPI_REDUCE( KEEP(103), INFOG(25), 1, MPI_INTEGER,
3102 & MPI_SUM, MASTER, id%COMM, IERR)
3103 KEEP(229) = INFOG(25)
3104 CALL MPI_REDUCE( KEEP(105), INFOG(25), 1, MPI_INTEGER,
3105 & MPI_SUM, MASTER, id%COMM, IERR)
3106 KEEP(230) = INFOG(25)
3107
3108 id%INFO(25) = KEEP(98)
3109 CALL MPI_ALLREDUCE( id%INFO(25), INFOG(25), 1, MPI_INTEGER,
3110 & MPI_SUM, id%COMM, IERR)
3111
3112 CALL MUMPS_REDUCEI8( id%KEEP8(8), id%KEEP8(108), MPI_SUM,
3113 & MASTER, id%COMM )
3114
3115 CALL MUMPS_SETI8TOI4(id%KEEP8(10), id%INFO(27))
3116 CALL MUMPS_REDUCEI8( id%KEEP8(10),id%KEEP8(110), MPI_SUM,
3117 & MASTER, id%COMM )
3118 CALL MUMPS_SETI8TOI4(id%KEEP8(110), INFOG(29))
3119
3120 id%INFO(28) = id%INFO(27)
3121 INFOG(35) = INFOG(29)
3122
3123
3124
3125.NE. IF ( KEEP(486) 0 ) THEN !LR is activated
3126
3127 RINFO(4) = dble(FLOP_FRFRONTS + FLOP_FACTO_FR - FLOP_LRGAIN
3128 & + FLOP_COMPRESS + FLOP_FRFRONTS)
3129
3130
3131
3132 ITMP8 = id%KEEP8(10) - int(MRY_LU_LRGAIN,8)
3133 CALL MUMPS_SETI8TOI4( ITMP8, id%INFO(28))
3134
3135 CALL MPI_REDUCE( MRY_LU_LRGAIN, TMP_MRY_LU_LRGAIN
3136 & , 1, MPI_DOUBLE_PRECISION,
3137 & MPI_SUM, MASTER, id%COMM, IERR)
3138 CALL MPI_REDUCE( MRY_LU_FR, TMP_MRY_LU_FR
3139 & , 1, MPI_DOUBLE_PRECISION,
3140 & MPI_SUM, MASTER, id%COMM, IERR)
3141 CALL MPI_REDUCE( MRY_CB_FR, TMP_MRY_CB_FR
3142 & , 1, MPI_DOUBLE_PRECISION,
3143 & MPI_SUM, MASTER, id%COMM, IERR)
3144 CALL MPI_REDUCE( MRY_CB_LRGAIN, TMP_MRY_CB_LRGAIN
3145 & , 1, MPI_DOUBLE_PRECISION,
3146 & MPI_SUM, MASTER, id%COMM, IERR)
3147 CALL MPI_REDUCE( FLOP_LRGAIN, TMP_FLOP_LRGAIN
3148 & , 1, MPI_DOUBLE_PRECISION,
3149 & MPI_SUM, MASTER, id%COMM, IERR)
3150 CALL MPI_REDUCE( FLOP_TRSM_FR, TMP_FLOP_TRSM_FR
3151 & , 1, MPI_DOUBLE_PRECISION,
3152 & MPI_SUM, MASTER, id%COMM, IERR)
3153 CALL MPI_REDUCE( FLOP_TRSM_LR, TMP_FLOP_TRSM_LR
3154 & , 1, MPI_DOUBLE_PRECISION,
3155 & MPI_SUM, MASTER, id%COMM, IERR)
3156 CALL MPI_REDUCE( FLOP_UPDATE_FR, TMP_FLOP_UPDATE_FR
3157 & , 1, MPI_DOUBLE_PRECISION,
3158 & MPI_SUM, MASTER, id%COMM, IERR)
3159 CALL MPI_REDUCE( FLOP_UPDATE_LR, TMP_FLOP_UPDATE_LR
3160 & , 1, MPI_DOUBLE_PRECISION,
3161 & MPI_SUM, MASTER, id%COMM, IERR)
3162 CALL MPI_REDUCE( FLOP_FRSWAP_COMPRESS,
3163 & TMP_FLOP_FRSWAP_COMPRESS
3164 & , 1, MPI_DOUBLE_PRECISION,
3165 & MPI_SUM, MASTER, id%COMM, IERR)
3166 CALL MPI_REDUCE( FLOP_MIDBLK_COMPRESS,
3167 & TMP_FLOP_MIDBLK_COMPRESS
3168 & , 1, MPI_DOUBLE_PRECISION,
3169 & MPI_SUM, MASTER, id%COMM, IERR)
3170 CALL MPI_REDUCE( FLOP_UPDATE_LRLR3, TMP_FLOP_UPDATE_LRLR3
3171 & , 1, MPI_DOUBLE_PRECISION,
3172 & MPI_SUM, MASTER, id%COMM, IERR)
3173 CALL MPI_REDUCE(FLOP_ACCUM_COMPRESS, TMP_FLOP_ACCUM_COMPRESS
3174 & , 1, MPI_DOUBLE_PRECISION,
3175 & MPI_SUM, MASTER, id%COMM, IERR)
3176 CALL MPI_REDUCE( FLOP_TRSM, TMP_FLOP_TRSM
3177 & , 1, MPI_DOUBLE_PRECISION,
3178 & MPI_SUM, MASTER, id%COMM, IERR)
3179 CALL MPI_REDUCE( FLOP_PANEL, TMP_FLOP_PANEL
3180 & , 1, MPI_DOUBLE_PRECISION,
3181 & MPI_SUM, MASTER, id%COMM, IERR)
3182 CALL MPI_REDUCE( FLOP_FRFRONTS, TMP_FLOP_FRFRONTS
3183 & , 1, MPI_DOUBLE_PRECISION,
3184 & MPI_SUM, MASTER, id%COMM, IERR)
3185 CALL MPI_REDUCE( FLOP_COMPRESS, TMP_FLOP_COMPRESS
3186 & , 1, MPI_DOUBLE_PRECISION,
3187 & MPI_SUM, MASTER, id%COMM, IERR)
3188 CALL MPI_REDUCE( FLOP_DECOMPRESS, TMP_FLOP_DECOMPRESS
3189 & , 1, MPI_DOUBLE_PRECISION,
3190 & MPI_SUM, MASTER, id%COMM, IERR)
3191 CALL MPI_REDUCE( FLOP_CB_COMPRESS, TMP_FLOP_CB_COMPRESS
3192 & , 1, MPI_DOUBLE_PRECISION,
3193 & MPI_SUM, MASTER, id%COMM, IERR)
3194 CALL MPI_REDUCE( FLOP_CB_DECOMPRESS,TMP_FLOP_CB_DECOMPRESS
3195 & , 1, MPI_DOUBLE_PRECISION,
3196 & MPI_SUM, MASTER, id%COMM, IERR)
3197 CALL MPI_REDUCE( FLOP_FACTO_FR, TMP_FLOP_FACTO_FR
3198 & , 1, MPI_DOUBLE_PRECISION,
3199 & MPI_SUM, MASTER, id%COMM, IERR)
3200 CALL MPI_REDUCE( CNT_NODES,TMP_CNT_NODES
3201 & , 1, MPI_INTEGER,
3202 & MPI_SUM, MASTER, id%COMM, IERR)
3203.GT. IF (id%NPROCS1) THEN
3204 FLOP_FACTO_LR = FLOP_FACTO_FR - FLOP_LRGAIN
3205 & + FLOP_COMPRESS + FLOP_FRFRONTS
3206 CALL MPI_REDUCE( FLOP_FACTO_LR, AVG_FLOP_FACTO_LR
3207 & , 1, MPI_DOUBLE_PRECISION,
3208 & MPI_SUM, MASTER, id%COMM, IERR)
3209.EQ. IF (id%MYIDMASTER) THEN
3210 AVG_FLOP_FACTO_LR = AVG_FLOP_FACTO_LR/id%NPROCS
3211 ENDIF
3212 CALL MPI_REDUCE( FLOP_FACTO_LR, MIN_FLOP_FACTO_LR
3213 & , 1, MPI_DOUBLE_PRECISION,
3214 & MPI_MIN, MASTER, id%COMM, IERR)
3215 CALL MPI_REDUCE( FLOP_FACTO_LR, MAX_FLOP_FACTO_LR
3216 & , 1, MPI_DOUBLE_PRECISION,
3217 & MPI_MAX, MASTER, id%COMM, IERR)
3218 ENDIF ! NPROCS > 1
3219 CALL MPI_REDUCE( TIME_UPDATE, TMP_TIME_UPDATE
3220 & , 1, MPI_DOUBLE_PRECISION,
3221 & MPI_SUM, MASTER, id%COMM, IERR)
3222 CALL MPI_REDUCE( TIME_UPDATE_LRLR1, TMP_TIME_UPDATE_LRLR1
3223 & , 1, MPI_DOUBLE_PRECISION,
3224 & MPI_SUM, MASTER, id%COMM, IERR)
3225 CALL MPI_REDUCE( TIME_UPDATE_LRLR2, TMP_TIME_UPDATE_LRLR2
3226 & , 1, MPI_DOUBLE_PRECISION,
3227 & MPI_SUM, MASTER, id%COMM, IERR)
3228 CALL MPI_REDUCE( TIME_UPDATE_LRLR3, TMP_TIME_UPDATE_LRLR3
3229 & , 1, MPI_DOUBLE_PRECISION,
3230 & MPI_SUM, MASTER, id%COMM, IERR)
3231 CALL MPI_REDUCE( TIME_UPDATE_FRLR, TMP_TIME_UPDATE_FRLR
3232 & , 1, MPI_DOUBLE_PRECISION,
3233 & MPI_SUM, MASTER, id%COMM, IERR)
3234 CALL MPI_REDUCE( TIME_UPDATE_FRFR, TMP_TIME_UPDATE_FRFR
3235 & , 1, MPI_DOUBLE_PRECISION,
3236 & MPI_SUM, MASTER, id%COMM, IERR)
3237 CALL MPI_REDUCE( TIME_DIAGCOPY, TMP_TIME_DIAGCOPY
3238 & , 1, MPI_DOUBLE_PRECISION,
3239 & MPI_SUM, MASTER, id%COMM, IERR)
3240 CALL MPI_REDUCE( TIME_COMPRESS,TMP_TIME_COMPRESS
3241 & , 1, MPI_DOUBLE_PRECISION,
3242 & MPI_SUM, MASTER, id%COMM, IERR)
3243 CALL MPI_REDUCE( TIME_MIDBLK_COMPRESS,
3244 & TMP_TIME_MIDBLK_COMPRESS
3245 & , 1, MPI_DOUBLE_PRECISION,
3246 & MPI_SUM, MASTER, id%COMM, IERR)
3247 CALL MPI_REDUCE( TIME_FRSWAP_COMPRESS,
3248 & TMP_TIME_FRSWAP_COMPRESS
3249 & , 1, MPI_DOUBLE_PRECISION,
3250 & MPI_SUM, MASTER, id%COMM, IERR)
3251 CALL MPI_REDUCE( TIME_CB_COMPRESS, TMP_TIME_CB_COMPRESS
3252 & , 1, MPI_DOUBLE_PRECISION,
3253 & MPI_SUM, MASTER, id%COMM, IERR)
3254 CALL MPI_REDUCE( TIME_DECOMP, TMP_TIME_DECOMP
3255 & , 1, MPI_DOUBLE_PRECISION,
3256 & MPI_SUM, MASTER, id%COMM, IERR)
3257 CALL MPI_REDUCE( TIME_DECOMP_UCFS, TMP_TIME_DECOMP_UCFS
3258 & , 1, MPI_DOUBLE_PRECISION,
3259 & MPI_SUM, MASTER, id%COMM, IERR)
3260 CALL MPI_REDUCE( TIME_DECOMP_ASM1, TMP_TIME_DECOMP_ASM1
3261 & , 1, MPI_DOUBLE_PRECISION,
3262 & MPI_SUM, MASTER, id%COMM, IERR)
3263 CALL MPI_REDUCE(TIME_DECOMP_LOCASM2, TMP_TIME_DECOMP_LOCASM2
3264 & , 1, MPI_DOUBLE_PRECISION,
3265 & MPI_SUM, MASTER, id%COMM, IERR)
3266 CALL MPI_REDUCE(TIME_DECOMP_MAPLIG1, TMP_TIME_DECOMP_MAPLIG1
3267 & , 1, MPI_DOUBLE_PRECISION,
3268 & MPI_SUM, MASTER, id%COMM, IERR)
3269 CALL MPI_REDUCE( TIME_DECOMP_ASMS2S, TMP_TIME_DECOMP_ASMS2S
3270 & , 1, MPI_DOUBLE_PRECISION,
3271 & MPI_SUM, MASTER, id%COMM, IERR)
3272 CALL MPI_REDUCE( TIME_DECOMP_ASMS2M, TMP_TIME_DECOMP_ASMS2M
3273 & , 1, MPI_DOUBLE_PRECISION,
3274 & MPI_SUM, MASTER, id%COMM, IERR)
3275 CALL MPI_REDUCE( TIME_PANEL, TMP_TIME_PANEL
3276 & , 1, MPI_DOUBLE_PRECISION,
3277 & MPI_SUM, MASTER, id%COMM, IERR)
3278 CALL MPI_REDUCE( TIME_FAC_I, TMP_TIME_FAC_I
3279 & , 1, MPI_DOUBLE_PRECISION,
3280 & MPI_SUM, MASTER, id%COMM, IERR)
3281 CALL MPI_REDUCE( TIME_FAC_MQ, TMP_TIME_FAC_MQ
3282 & , 1, MPI_DOUBLE_PRECISION,
3283 & MPI_SUM, MASTER, id%COMM, IERR)
3284 CALL MPI_REDUCE( TIME_FAC_SQ, TMP_TIME_FAC_SQ
3285 & , 1, MPI_DOUBLE_PRECISION,
3286 & MPI_SUM, MASTER, id%COMM, IERR)
3287 CALL MPI_REDUCE( TIME_LRTRSM, TMP_TIME_LRTRSM
3288 & , 1, MPI_DOUBLE_PRECISION,
3289 & MPI_SUM, MASTER, id%COMM, IERR)
3290 CALL MPI_REDUCE( TIME_FRTRSM, TMP_TIME_FRTRSM
3291 & , 1, MPI_DOUBLE_PRECISION,
3292 & MPI_SUM, MASTER, id%COMM, IERR)
3293 CALL MPI_REDUCE( TIME_FRFRONTS, TMP_TIME_FRFRONTS
3294 & , 1, MPI_DOUBLE_PRECISION,
3295 & MPI_SUM, MASTER, id%COMM, IERR)
3296 CALL MPI_REDUCE( TIME_LR_MODULE, TMP_TIME_LR_MODULE
3297 & , 1, MPI_DOUBLE_PRECISION,
3298 & MPI_SUM, MASTER, id%COMM, IERR)
3299.EQ. IF (id%MYIDMASTER) THEN
3300.GT. IF (id%NPROCS1) THEN
3301
3302
3303 MRY_LU_FR = TMP_MRY_LU_FR
3304 MRY_LU_LRGAIN = TMP_MRY_LU_LRGAIN
3305 MRY_CB_FR = TMP_MRY_CB_FR
3306 MRY_CB_LRGAIN = TMP_MRY_CB_LRGAIN
3307 FLOP_LRGAIN = TMP_FLOP_LRGAIN
3308 FLOP_PANEL = TMP_FLOP_PANEL
3309 FLOP_TRSM = TMP_FLOP_TRSM
3310 FLOP_TRSM_FR = TMP_FLOP_TRSM_FR
3311 FLOP_TRSM_LR = TMP_FLOP_TRSM_LR
3312 FLOP_UPDATE_FR = TMP_FLOP_UPDATE_FR
3313 FLOP_UPDATE_LR = TMP_FLOP_UPDATE_LR
3314 FLOP_UPDATE_LRLR3 = TMP_FLOP_UPDATE_LRLR3
3315 FLOP_COMPRESS = TMP_FLOP_COMPRESS
3316 FLOP_MIDBLK_COMPRESS = TMP_FLOP_MIDBLK_COMPRESS
3317 FLOP_FRSWAP_COMPRESS = TMP_FLOP_FRSWAP_COMPRESS
3318 FLOP_ACCUM_COMPRESS = TMP_FLOP_ACCUM_COMPRESS
3319 FLOP_CB_COMPRESS = TMP_FLOP_CB_COMPRESS
3320 FLOP_DECOMPRESS = TMP_FLOP_DECOMPRESS
3321 FLOP_CB_DECOMPRESS = TMP_FLOP_CB_DECOMPRESS
3322 FLOP_FRFRONTS = TMP_FLOP_FRFRONTS
3323 FLOP_FACTO_FR = TMP_FLOP_FACTO_FR
3324 CNT_NODES = TMP_CNT_NODES
3325 TIME_UPDATE = TMP_TIME_UPDATE /id%NPROCS
3326 TIME_UPDATE_LRLR1 = TMP_TIME_UPDATE_LRLR1 /id%NPROCS
3327 TIME_UPDATE_LRLR2 = TMP_TIME_UPDATE_LRLR2 /id%NPROCS
3328 TIME_UPDATE_LRLR3 = TMP_TIME_UPDATE_LRLR3 /id%NPROCS
3329 TIME_UPDATE_FRLR = TMP_TIME_UPDATE_FRLR /id%NPROCS
3330 TIME_UPDATE_FRFR = TMP_TIME_UPDATE_FRFR /id%NPROCS
3331 TIME_COMPRESS = TMP_TIME_COMPRESS /id%NPROCS
3332 TIME_MIDBLK_COMPRESS = TMP_TIME_MIDBLK_COMPRESS/id%NPROCS
3333 TIME_FRSWAP_COMPRESS = TMP_TIME_FRSWAP_COMPRESS/id%NPROCS
3334 TIME_DIAGCOPY = TMP_TIME_DIAGCOPY /id%NPROCS
3335 TIME_CB_COMPRESS = TMP_TIME_CB_COMPRESS /id%NPROCS
3336 TIME_PANEL = TMP_TIME_PANEL /id%NPROCS
3337 TIME_FAC_I = TMP_TIME_FAC_I /id%NPROCS
3338 TIME_FAC_MQ = TMP_TIME_FAC_MQ /id%NPROCS
3339 TIME_FAC_SQ = TMP_TIME_FAC_SQ /id%NPROCS
3340 TIME_LRTRSM = TMP_TIME_LRTRSM /id%NPROCS
3341 TIME_FRTRSM = TMP_TIME_FRTRSM /id%NPROCS
3342 TIME_FRFRONTS = TMP_TIME_FRFRONTS /id%NPROCS
3343 TIME_LR_MODULE = TMP_TIME_LR_MODULE /id%NPROCS
3344 TIME_DECOMP = TMP_TIME_DECOMP /id%NPROCS
3345 TIME_DECOMP_UCFS = TMP_TIME_DECOMP_UCFS /id%NPROCS
3346 TIME_DECOMP_ASM1 = TMP_TIME_DECOMP_ASM1 /id%NPROCS
3347 TIME_DECOMP_LOCASM2 = TMP_TIME_DECOMP_LOCASM2 /id%NPROCS
3348 TIME_DECOMP_MAPLIG1 = TMP_TIME_DECOMP_MAPLIG1 /id%NPROCS
3349 TIME_DECOMP_ASMS2S = TMP_TIME_DECOMP_ASMS2S /id%NPROCS
3350 TIME_DECOMP_ASMS2M = TMP_TIME_DECOMP_ASMS2M /id%NPROCS
3351 ENDIF
3352 CALL COMPUTE_GLOBAL_GAINS(id%KEEP8(110),id%RINFOG(3),
3353 & id%KEEP8(49), PROKG, MPG)
3354
3355
3356
3357
3358 CALL MUMPS_SETI8TOI4(id%KEEP8(49), id%INFOG(35))
3359 FRONTWISE = 0
3360
3361 IF (LPOK) THEN
3362 IF (CNTL(7) < 0.0D0) THEN
3363
3364
3365 WRITE(LP,'(/a/,a/,a/,a,a)')
3366 & ' warning in blr input setting',
3367 & ' cntl(7) < 0 is experimental: ',
3368 & ' rrqr precision = |cntl(7| x ||a_pre||, ',
3369 & ' where a_pre is
the preprocessed matrix as defined
',
3370 & ' in
the users guide '
3371 ENDIF
3372 ENDIF
3374 & keep(489),
id%DKEEP, n,
id%ICNTL(36),
3375 & keep(487), keep(488), keep(490),
3376 & keep(491), keep(50), keep(486),
3377 & keep(472), keep(475), keep(478), keep(480),
3378 & keep(481),
3379 & keep(483), keep(484),
3380 &
id%KEEP8(110),
id%KEEP8(49),
3381 & keep(28),
id%NPROCS, mpg, prokg)
3382
3383 rinfog(14) =
id%DKEEP(56)
3384 ELSE
3385 rinfog(14) = 0.0d00
3386 ENDIF
3387 ENDIF
3388
3389
3390
3391 IF(keep(110) .EQ. 1) THEN
3392
3393
3394 id%INFO(18) = keep(109)
3396 & mpi_sum,
id%COMM, ierr)
3397 ELSE
3399 keep(109) = 0
3400 keep(112) = 0
3401 ENDIF
3402 IF (
id%MYID.EQ.master)
THEN
3403
3404 infog(28)=keep(112)+keep(17)
3405 ENDIF
3406
3407
3408
3409
3410
3411
3412
3413 IF (keep(17) .NE. 0) THEN
3414 IF (
id%MYID .EQ. id_root)
THEN
3415
3416
3417
3418 id%INFO(18)=
id%INFO(18)+keep(17)
3419 ENDIF
3420 IF (id_root .EQ. master) THEN
3421 IF (
id%MYID.EQ.master)
THEN
3422
3423
3424
3425
3426
3427
3428
3429
3430 DO i= keep(17), 1, -1
3431
3432
3433 id%PIVNUL_LIST(keep(112)+i)=
id%PIVNUL_LIST(keep(109)+i)
3434 ENDDO
3435 ENDIF
3436 ELSE
3437
3438
3439
3440
3441
3442 IF (
id%MYID .EQ. id_root)
THEN
3443 CALL mpi_send(
id%PIVNUL_LIST(keep(109)+1), keep(17),
3444 & mpi_integer, master, zero_piv,
3446 ELSE IF (
id%MYID .EQ. master)
THEN
3447 CALL mpi_recv(
id%PIVNUL_LIST(keep(112)+1), keep(17),
3448 & mpi_integer, id_root, zero_piv,
3449 &
id%COMM, status, ierr )
3450 ENDIF
3451 ENDIF
3452 ENDIF
3453
3454
3455
3456
3457
3458
3459
3460 IF(keep(110) .EQ. 1) THEN
3461 ALLOCATE(itmp2(
id%NPROCS),stat = ierr )
3462 IF ( ierr .GT. 0 ) THEN
3464 id%INFO(2)=
id%NPROCS
3465 END IF
3467 &
id%COMM,
id%MYID )
3468 IF (
id%INFO(1).LT.0)
GOTO 490
3470 & itmp2(1), 1, mpi_integer,
3471 & master,
id%COMM, ierr)
3472 IF(
id%MYID .EQ. master)
THEN
3473 posbuf = itmp2(1)+1
3474
3475
3476 keep(220)=1
3477 DO i = 1,
id%NPROCS-1
3478 CALL mpi_recv(
id%PIVNUL_LIST(posbuf), itmp2(i+1),
3479 & mpi_integer,i,
3480 & zero_piv,
id%COMM, status, ierr)
3481
3482
3483
3484
3485 CALL mpi_send(posbuf, 1, mpi_integer, i, zero_piv,
3487 posbuf = posbuf + itmp2(i+1)
3488 ENDDO
3489 ELSE
3490 CALL mpi_send(
id%PIVNUL_LIST(1), keep(109), mpi_integer,
3491 & master,zero_piv,
id%COMM, ierr)
3492 CALL mpi_recv( keep(220), 1, mpi_integer, master, zero_piv
3493 &
id%COMM, status, ierr )
3494 ENDIF
3495 ENDIF
3496
3497
3498
3500 & mpi_double_precision,
3501 & mpi_min, master,
id%COMM, ierr )
3503 & mpi_double_precision,
3504 & mpi_min, master,
id%COMM, ierr )
3506 & mpi_double_precision,
3507 & mpi_max, master,
id%COMM, ierr )
3508
3509
3510
3511 CALL mpi_reduce(
id%KEEP8(80), itemp8, 1, mpi_integer8,
3512 & mpi_sum, master,
id%COMM, ierr )
3513 IF (
id%MYID .EQ. master)
THEN
3515 ENDIF
3516
3517
3518
3520 & mpi_max, master,
id%COMM, ierr )
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533 IF (
id%MYID.EQ.master .AND. lscal. and. keep(258).NE.0)
THEN
3534 k =
min(keep(143), keep(17))
3536 DO i = 1, keep(112)+ k
3537
3539 &
id%ROWSCA(
id%PIVNUL_LIST(i)),
3540 &
id%DKEEP(6), keep(259))
3542 &
id%COLSCA(
id%PIVNUL_LIST(i)),
3543 &
id%DKEEP(6), keep(259))
3544 ENDDO
3545 ENDIF
3546
3547
3548
3549 IF (keep(258).NE.0) THEN
3550
3551
3552
3553
3554 rinfog(13)=0.0d0
3555 IF (keep(260).EQ.-1) THEN
3556 id%DKEEP(6)=-
id%DKEEP(6)
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) == 1 .OR.
id%KEEP(50) == 2)
THEN
3593
3594 WRITE(mpg, 99987) infog(12)
3595 END IF
3596 IF (
id%KEEP(50) == 0)
THEN
3597
3598 WRITE(mpg, 99985) infog(12)
3599 END IF
3600 IF (
id%KEEP(50) .NE. 1)
THEN
3601
3602 WRITE(mpg, 99982) infog(13)
3603 END IF
3604 IF (keep(97) .NE. 0) THEN
3605
3606 WRITE(mpg, '(A,D16.4)')
3607 & ' Effective static pivoting thresh., CNTL(4) =', seuil
3608 WRITE(mpg, 99986) infog(25)
3609 ENDIF
3610 IF (
id%KEEP(50) == 2)
THEN
3611
3612 WRITE(mpg, 99988) keep(229)
3613
3614 WRITE(mpg, 99989) keep(230)
3615 ENDIF
3616
3617 IF (keep(110) .NE.0) THEN
3618 WRITE(mpg, 99991) keep(112)
3619 ENDIF
3620
3621 IF ( keep(19) .ne. 0 )
3622
3623 & WRITE(mpg, 99983) keep(17)
3624
3625 IF (keep(110).NE.0.OR.keep(19).NE.0)
3626
3627 & WRITE(mpg, 99992) keep(17)+keep(112)
3628
3629 WRITE(mpg, 99981) infog(14)
3630
3631
3632 IF (
id%KEEP8(108) .GT. 0_8)
THEN
3633 WRITE(mpg, 99980)
id%KEEP8(108)
3634 ENDIF
3635 IF ((keep(60).NE.0) .AND. infog(25).GT.0) THEN
3636
3637
3638 WRITE(mpg, '(A)')
3639 & " ** Warning Static pivoting was necessary"
3640 WRITE(mpg, '(A)')
3641 & " ** to factor interior variables with Schur ON"
3642 ENDIF
3643 IF (keep(258).NE.0) THEN
3644 WRITE(mpg,99978) rinfog(12)
3645 WRITE(mpg,99977) infog(34)
3646 ENDIF
3647 END IF
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658#if ! defined(NO_FDM_DESCBAND)
3659
3660#endif
3661#if ! defined(NO_FDM_MAPROW)
3662
3663#endif
3664
3665
3666 500 CONTINUE
3667
3668
3669
3670 IF (
id%KEEP(46).EQ.1 .AND.
3671 &
id%KEEP(55).NE.0 .AND.
3672 &
id%MYID.EQ.master .AND.
3673 &
id%KEEP(52) .EQ. 0)
THEN
3675 ELSE
3676 IF (
associated(
id%DBLARR))
THEN
3677 DEALLOCATE(
id%DBLARR)
3679 ENDIF
3680 ENDIF
3681#if ! defined(NO_FDM_DESCBAND)
3682 IF (i_am_slave) THEN
3684 ENDIF
3685#endif
3686#if ! defined(NO_FDM_MAPROW)
3687 IF (i_am_slave) THEN
3689 ENDIF
3690#endif
3691 IF (i_am_slave) THEN
3692
3693 IF (
3694 & (
3695 & (keep(486).EQ.2)
3696 & )
3697 & .AND.
id%INFO(1).GE.0
3698 & ) THEN
3699
3700
3702 ELSE
3703
3705 ENDIF
3706 ENDIF
3707 IF (i_am_slave) THEN
3709
3710 IF (
3711 & (
3712 & (keep(486).EQ.2)
3713 & )
3714 & .AND.
id%INFO(1).GE.0
3715 & ) THEN
3718 IF (.NOT.
associated(
id%FDM_F_ENCODING))
THEN
3719 WRITE(*,*) "Internal error 2 in DMUMPS_FAC_DRIVER"
3720 ENDIF
3721 ELSE
3723 ENDIF
3724 ENDIF
3725
3726
3727
3728
3729
3730
3731 514 CONTINUE
3732 IF ( i_am_slave ) THEN
3733 IF ((keep(201).EQ.1).OR.(keep(201).EQ.2)) THEN
3735 IF (
id%ASSOCIATED_OOC_FILES)
THEN
3736 id%ASSOCIATED_OOC_FILES = .false.
3737 ENDIF
3738 IF (ierr.LT.0 .AND.
id%INFO(1) .GE. 0)
id%INFO(1) = ierr
3739 ENDIF
3740 IF (wk_user_provided) THEN
3741
3743 ELSE IF (keep(201).NE.0) THEN
3744
3745
3746
3747
3748
3749
3750
3751 IF (
associated(
id%S))
DEALLOCATE(
id%S)
3754 ENDIF
3755 ELSE
3756 IF (wk_user_provided) THEN
3757
3759 ELSE
3760 IF (
associated(
id%S))
DEALLOCATE(
id%S)
3763 END IF
3764 END IF
3765
3766
3767
3768 513 CONTINUE
3769 IF ( i_am_slave ) THEN
3771 IF (ierr.LT.0 .AND.
id%INFO(1) .GE. 0)
id%INFO(1) = ierr
3772 ENDIF
3774 &
id%COMM,
id%MYID )
3775
3776
3777
3778
3779 517 CONTINUE
3780
3781
3782
3783 530 CONTINUE
3784
3785
3786 IF (rhs_mumps_allocated) DEALLOCATE(rhs_mumps)
3787 NULLIFY(rhs_mumps)
3788
3789 id%KEEP8(26) = keep826_save
3790 RETURN
3791 120 FORMAT(/' Local redistrib: data local/sent =',i16,i16)
3792 125 FORMAT(/' Redistrib: total data local/sent =',i16,i16)
3793 130 FORMAT(//'****** FACTORIZATION STEP ********'/)
3794 160 FORMAT(
3795 & /' Elapsed time to reformat/distribute matrix =',f12.4)
3796 166 FORMAT(' Max difference from 1 after scaling the entries',
3797 & ' for ONE-NORM (option 7/8) =',d9.2)
3798 170 FORMAT(' STATISTICS PRIOR NUMERICAL FACTORIZATION ...'/
3799 & ' Size of internal working array S =',i16/
3800 & ' Size of internal working array IS =',i16/
3801 & ' Minimum (ICNTL(14)=0) size of S =',i16/
3802 & ' Minimum (ICNTL(14)=0) size of IS =',i16/
3803 & ' Real space for original matrix =',i16/
3804 & ' Integer space for original matrix =',i16/
3805 & ' INFO(3) Real space for factors (estimated) =',i16/
3806 & ' INFO(4) Integer space for factors (estim.) =',i16/
3807 & ' Maximum frontal size (estimated) =',i16)
3808 172 FORMAT(' GLOBAL STATISTICS PRIOR NUMERICAL FACTORIZATION ...'/
3809 & ' Number of working processes =',i16/
3810 & ' ICNTL(22) Out-of-core option =',i16/
3811 & ' ICNTL(35) BLR activation (eff. choice) =',i16/
3812 & ' ICNTL(14) Memory relaxation =',i16/
3813 & ' INFOG(3) Real space for factors (estimated)=',i16/
3814 & ' INFOG(4) Integer space for factors (estim.)=',i16/
3815 & ' Maximum frontal size (estimated) =',i16/
3816 & ' Number of nodes in the tree =',i16/
3817 & ' ICNTL(23) Memory allowed (value on host) =',i16/
3818 & ' Sum over all procs =',i16/
3819 & ' Memory provided by user, sum of LWK_USER =',i16/
3820 & ' Effective threshold for pivoting, CNTL(1) =',d16.4)
3821 173 FORMAT( ' Perform forward during facto, NRHS =',i16)
3822 174 FORMAT( ' KEEP(268) Relaxed pivoting effective value =',i16)
3823 180 FORMAT(/' Elapsed time for factorization =',f12.4)
3824 185 FORMAT(/' Elapsed time for (failed) factorization =',f12.4)
3825 187 FORMAT( ' Elapsed time under L0 =',f12.4)
3826 188 FORMAT( ' Elapsed time under L0 (avg/max across MPI) =',
3827 & f12.4,f12.4)
3828 189 FORMAT(/' Flops under L0 layer =',1pd12.3)
3829 190 FORMAT(/' Flops under L0 Layer (avg/max across MPI) =',
3830 & 1pd12.3,1pd12.3)
383199977 FORMAT( ' INFOG(34) Determinant (base 2 exponent) =',i16)
383299978 FORMAT( ' RINFOG(12) Determinant (real part) =',f16.8)
383399980 FORMAT( ' Extra copies due to In-Place stacking =',i16)
383499981 FORMAT( ' INFOG(14) Number of memory compress =',i16)
383599982 FORMAT( ' INFOG(13) Number of delayed pivots =',i16)
383699983 FORMAT( ' Nb of singularities detected by ICNTL(56) =',i16)
383799991 FORMAT( ' Nb of null pivots detected by ICNTL(24) =',i16)
383899992 FORMAT( ' INFOG(28) Estimated deficiency =',i16)
383999984 FORMAT(/'Leaving factorization with ...'/
3840 & ' RINFOG(2) Operations in node assembly =',1pd10.3/
3841 & ' ------(3) Operations in node elimination =',1pd10.3/
3842 & ' ICNTL (8) Scaling effectively used =',i16/
3843 & ' INFOG (9) Real space for factors =',i16/
3844 & ' INFOG(10) Integer space for factors =',i16/
3845 & ' INFOG(11) Maximum front size =',i16/
3846 & ' INFOG(29) Number of entries in factors =',i16)
384799985 FORMAT( ' INFOG(12) Number of off diagonal pivots =',i16)
384899986 FORMAT( ' INFOG(25) Number of tiny pivots(static) =',i16)
384999987 FORMAT( ' INFOG(12) Number of negative pivots =',i16)
385099988 FORMAT( ' Number of 2x2 pivots in type 1 nodes =',i16)
385199989 FORMAT( ' Number of 2x2 pivots in type 2 nodes =',i16)
subroutine mumps_propinfo(icntl, info, comm, id)
subroutine dmumps_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 dmumps_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 dmumps_free_id_data_modules(id_fdm_f_encoding, id_blrarray_encoding, keep8, k34)
subroutine dmumps_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, dmumps_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 dmumps_deter_square(deter, nexp)
subroutine dmumps_updatedeter_scaling(piv, deter, nexp)
subroutine dmumps_deter_sign_perm(deter, n, visited, perm)
subroutine dmumps_deter_reduction(comm, deter_in, nexp_in, deter_out, nexp_out, nprocs)
subroutine dmumps_deter_scaling_inverse(deter, nexp)
subroutine dmumps_maxelt_size(eltptr, nelt, maxelt_size)
subroutine dmumps_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 dmumps_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 dmumps_print_allocated_mem(prok, prokg, print_maxavg, mp, mpg, info16, infog18, infog19, nslaves, irank, keep)
subroutine dmumps_avgmax_stat8(prokg, mpg, val, nslaves, print_maxavg, comm, msg)
subroutine dmumps_extract_schur_redrhs(id)
subroutine dmumps_anorminf(id, anorminf, lscal, eff_size_schur)
subroutine dmumps_fac_a(n, nz8, nsca, aspk, irn, icn, colsca, rowsca, wk, lwk8, wk_real, lwk_real, icntl, info)
subroutine dmumps_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)
end diagonal values have been computed in the(sparse) matrix id.SOL
subroutine dmumps_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 dmumps_buf_deall_small_buf(ierr)
subroutine, public dmumps_buf_alloc_small_buf(size, ierr)
subroutine, public dmumps_buf_deall_max_array()
subroutine, public dmumps_buf_max_array_minsize(nfs4father, ierr)
subroutine, public dmumps_buf_dist_irecv_size(dmumps_lbufr_bytes)
subroutine, public dmumps_buf_ini_myid(myid)
subroutine, public dmumps_init_l0_omp_factors(id_l0_omp_factors)
subroutine, public dmumps_free_l0_omp_factors(id_l0_omp_factors)
subroutine, public dmumps_load_end(info1, nslaves, ierr)
subroutine, public dmumps_load_set_inicost(cost_subtree_arg, k64, dk15, k375, maxs)
subroutine, public dmumps_load_init(id, memory_md_arg, maxs)
subroutine, public dmumps_load_update(check_flops, process_bande, inc_load, keep, keep8)
subroutine, public dmumps_blr_mod_to_struc(id_blrarray_encoding)
subroutine, public dmumps_blr_init_module(initial_size, info)
subroutine, public dmumps_blr_end_module(info1, keep8, k34, lrsolve_act_opt)
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)
subroutine init_stats_global(id)
subroutine, public dmumps_ooc_init_facto(id, maxs)
subroutine dmumps_ooc_end_facto(id, ierr)
subroutine dmumps_ooc_clean_pending(ierr)
subroutine dmumps_clean_ooc_data(id, 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)