17 INTEGER,
PARAMETER :: UNIT_MIN = 10
18 INTEGER,
PARAMETER :: UNIT_MAX = 500
22 DO i = unit_min, unit_max
23 INQUIRE(unit=i, opened=busy)
24 IF ( .NOT. busy )
THEN
33 INTEGER,
intent( in ) :: N
34 INTEGER,
intent( in ) :: NFSIZ( N )
35 INTEGER,
intent( inout ) :: FRERE( ), FILS( N )
36 INTEGER,
intent( out ) :: THEROOT
37 INTEGER INODE, , IFILS, IN, IROOTLAST, SIZE
41 IF ( frere( inode ) .EQ. 0 )
THEN
42 IF ( nfsiz( inode ) .GT.
SIZE )
THEN
49 DO WHILE ( fils( in ) .GT. 0 )
55 IF ( frere( inode ) .eq. 0 .and. inode .ne. iroot )
THEN
56 IF ( ifils .eq. 0 )
THEN
57 fils( irootlast ) = - inode
58 frere( inode ) = -iroot
61 frere( inode ) = -fils( irootlast )
62 fils( irootlast ) = - inode
70 INTEGER,
INTENT(IN) :: tpn, iproc, k199
81 INTEGER procinfo_inode
92 INTEGER procinfo_inode, tpn
94 tpn = ishft(procinfo_inode,-24) - 1
97 ELSE IF (tpn.GE.4)
THEN
101 IF (procinfo_inode <= k199 )
THEN
104 tpn = (procinfo_inode-1+2*k199)/k199 - 1
105 IF ( tpn .LT. 1 ) tpn = 1
106 IF (tpn.EQ.4.OR.tpn.EQ.5.OR.tpn.EQ.6) tpn = 2
113 & MUMPS_PROCNODE, PROCINFO_INODE, K199 )
114 INTEGER,
INTENT(IN) :: K199, PROCINFO_INODE
115 INTEGER,
intent(out) :: TPN, MUMPS_PROCNODE
117 mumps_procnode=iand(procinfo_inode,
118#if defined(MUMPS_F2003)
119 & int(b
"111111111111111111111111"))
123 tpn = ishft(procinfo_inode,-24) - 1
126 ELSE IF (tpn.GE.4)
THEN
132 IF (procinfo_inode <= k199)
THEN
138 tpn = (procinfo_inode-1+2*k199)/k199-1
139 mumps_procnode = (procinfo_inode-1+2*k199)-
143 ELSE IF (tpn .ge. 4)
THEN
153 INTEGER procinfo_inode
156#if defined(MUMPS_F2003)
157 & int(b
"111111111111111111111111"))
172 INTEGER,
intent(in) :: k199
173 INTEGER procinfo_inode, tpn
175 tpn = ishft(procinfo_inode,-24) - 1
178 IF (procinfo_inode <= k199
THEN
181 tpn = (procinfo_inode-1+2*k199)/k199 - 1
182 IF ( tpn .LT. 1 ) tpn = 1
191 INTEGER tpn, procinfo_inode
193 tpn = ishft(procinfo_inode,-24) - 1
195 tpn = (procinfo_inode-1+2*k199)/k199 - 1
203 INTEGER , procinfo_inode
205 tpn = ishft(procinfo_inode,-24) - 1
207 tpn = (procinfo_inode-1+k199+k199)/k199 - 1
213 & ( procinfo_inode, k199 )
216 INTEGER tpn, procinfo_inode
218 tpn = ishft(procinfo_inode,-24) - 1
220 tpn = (procinfo_inode-1+k199+k199)/k199 - 1
223 & ( tpn .eq. -1 .OR. tpn .eq. 0 )
227 & SSARBR, INODE, DAD, N,
229 & STEP, PROCNODE_STEPS, K199)
231 INTEGER,
INTENT(IN) :: N, , K199, INODE
232 INTEGER,
INTENT(IN) :: DAD(KEEP28), PROCNODE_STEPS(KEEP28)
233 INTEGER,
INTENT(IN) :: STEP(N)
234 LOGICAL,
INTENT(OUT) :: SSARBR
235 INTEGER :: DADINODE, TYPEDAD
236 LOGICAL,
EXTERNAL :: MUMPS_INSSARBR
237 INTEGER,
EXTERNAL :: MUMPS_TYPENODE
239 dadinode = dad(step(inode))
240 IF (dadinode .NE. 0)
THEN
241 typedad = mumps_typenode(procnode_steps(step(dadinode)),
243 IF (typedad.EQ.1)
THEN
244 ssarbr=mumps_inssarbr(procnode_steps(step(dadinode)),
251 & NMB_PAR2, ISTEP_TO_INIV2 , K71, STEP, N,
252 & CANDIDATES, KEEP24 )
254 INTEGER myid, slavef, inode, nmb_par2, keep24, i
256 INTEGER istep_to_iniv2 ( k71 ), step ( n )
257 INTEGER candidates(slavef+1,
max(nmb_par2,1))
258 INTEGER ncand, posinode
260 IF (keep24 .eq. 0)
RETURN
261 posinode = istep_to_iniv2( step(inode) )
262 ncand = candidates( slavef+1, posinode )
264 IF (myid .EQ. candidates( i, posinode ))
271 DOUBLE PRECISION MPI_WTIME
278 DOUBLE PRECISION MPI_WTIME
286 DOUBLE PRECISION VAL( N )
288 DOUBLE PRECISION SWAP
291 DO WHILE ( .NOT. done )
294 IF ( val( i ) .GT. val( i + 1 ) )
THEN
297 id( i ) = id( i + 1 )
300 val( i ) = val( i + 1 )
310 DOUBLE PRECISION VAL( N )
312 DOUBLE PRECISION SWAP
315 DO WHILE ( .NOT. done )
318 IF ( val( i ) .LT. val( i + 1 ) )
THEN
321 id( i ) = id( i + 1 )
324 val( i ) = val( i + 1 )
332 SUBROUTINE descinit( DESC, M, N, MB, NB, IRSRC, ICSRC, ICTXT,
334 INTEGER ICSRC, ICTXT, INFO, IRSRC, LLD, M, MB, N, NB
336 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
337 & lld_, mb_, m_, nb_, n_, rsrc_
339 parameter( dlen_ = 8, dtype_ = 1,
340 & ctxt_ = 7, m_ = 1, n_ = 2, mb_ = 3, nb_ = 4,
341 & rsrc_ = 5, csrc_ = 6, lld_ = 8 )
343 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
344 & ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
345 & rsrc_ = 7, csrc_ = 8, lld_ = 9 )
347 INTEGER MYCOL, , NPCOL, NPROW
348 EXTERNAL blacs_gridinfo, PXERBLA
352 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
356 ELSE IF( n.LT.0 )
THEN
358 ELSE IF( mb.LT.1 )
THEN
360 ELSE IF( nb.LT.1 )
THEN
362 ELSE IF( irsrc.LT.0 .OR. irsrc.GE.nprow )
THEN
364 ELSE IF( icsrc.LT.0 .OR. icsrc.GE.npcol )
THEN
366 ELSE IF( nprow.EQ.-1 )
THEN
368 ELSE IF( lld.LT.
max( 1, numroc( m, mb, myrow, irsrc,
373 &
CALL pxerbla( ictxt,
'DESCINIT', -info )
375 desc( dtype_ ) = block_cyclic_2d
377 desc( m_ ) =
max( 0, m )
378 desc( n_ ) =
max( 0, n )
379 desc( mb_ ) =
max( 1, mb )
380 desc( nb_ ) =
max( 1, nb )
381 desc( rsrc_ ) =
max( 0,
min( irsrc, nprow-1 ) )
382 desc( csrc_ ) =
max( 0,
min( icsrc, npcol-1 ) )
383 desc( ctxt_ ) = ictxt
384 desc( lld_ ) =
max( lld,
max( 1, numroc( desc( m_ ), desc( mb_ ),
385 & myrow, desc( rsrc_ ), nprow ) ) )
388 SUBROUTINE pxerbla( ICTXT, SRNAME, INFO )
391 INTEGER MYCOL, MYROW, NPCOL, NPROW
392 EXTERNAL blacs_gridinfo
393 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
394 WRITE( *, fmt = 9999 ) myrow, mycol, srname, info
395 9999
FORMAT(
'{', i5,
',', i5,
'}: On entry to ', a,
396 &
' parameter number', i4,
' had an illegal value' )
401 INTEGER MYID, COMM, IRANK, INFO, INFOG(2)
403 INTEGER IERR_MPI, MASTER
404#if defined(WORKAROUNDINTELILP64MPI2INTEGER)
405 INTEGER(4) :: TEMP1(2),TEMP2(2)
407 INTEGER :: (2),TEMP2(2)
409 parameter( master = 0 )
410 CALL mpi_reduce( info, infog(1), 1, mpi_integer,
411 & mpi_max, master, comm, ierr_mpi )
412 CALL mpi_reduce( info, infog(2), 1, mpi_integer,
413 & mpi_sum, master, comm, ierr_mpi )
416 CALL mpi_reduce( temp1, temp2, 1, mpi_2integer,
417 & mpi_maxloc, master, comm, ierr_mpi )
418 IF ( myid.eq. master )
THEN
419 IF ( infog(1) .ne. temp2(1) )
THEN
420 write(*,*)
'Error in MUMPS_MEM_CENTRALIZE'
430 & (max_active_nodes,keep,keep8)
432 INTEGER max_active_nodes
434 INTEGER(8) keep8(150)
439 & nb_prun_roots, Pruned_Roots,
440 & MYROOT, MYID_NODES,
441 & KEEP, KEEP8, STEP, PROCNODE_STEPS,
444 INTEGER,
INTENT(IN) :: N, MYID_NODES, LPOOL, nb_prun_roots
446 INTEGER(8) KEEP8(150)
447 INTEGER,
INTENT(IN) :: STEP(N)
448 INTEGER,
INTENT(IN) :: PROCNODE_STEPS(KEEP(28))
449 INTEGER,
INTENT(IN) :: Pruned_Roots(nb_prun_roots)
450 INTEGER,
INTENT(OUT) :: MYROOT
451 INTEGER,
INTENT(OUT) :: IPOOL(LPOOL)
452 INTEGER,
EXTERNAL :: MUMPS_PROCNODE
455 DO i = nb_prun_roots, 1, -1
456 inode = pruned_roots(i)
457 IF (mumps_procnode(procnode_steps(step(inode)),
458 & keep(199)) .EQ. myid_nodes)
THEN
460 ipool(myroot) = inode
466 & nb_prun_roots, Pruned_Roots,
467 & MYROOT, MYID_NODES,
468 & KEEP, KEEP8, STEP, PROCNODE_STEPS,
469 & IPOOL, LPOOL, TO_PROCESS )
471 INTEGER,
INTENT(IN) :: N, MYID_NODES, LPOOL, nb_prun_roots
473 INTEGER(8) KEEP8(150)
474 INTEGER,
INTENT(IN) :: STEP(N)
475 INTEGER,
INTENT(IN) :: PROCNODE_STEPS(KEEP(28))
476 LOGICAL,
INTENT(IN) :: TO_PROCESS(KEEP(28))
477 INTEGER,
INTENT(IN) :: (nb_prun_roots)
478 INTEGER,
INTENT(OUT) :: MYROOT
479 INTEGER,
INTENT(OUT) :: IPOOL(LPOOL)
480 INTEGER,
EXTERNAL :: MUMPS_PROCNODE
483 do i = nb_prun_roots, 1, -1
484 inode = pruned_roots(i)
485 IF (mumps_procnode(procnode_steps(step(inode)),
486 & keep(199)) .EQ. myid_nodes)
THEN
487 IF ( to_process(step(inode)) )
THEN
489 ipool(myroot) = inode
496 & NA, LNA, KEEP, KEEP8, STEP, PROCNODE_STEPS,
499 INTEGER,
INTENT(IN) :: N, MYID_NODES, LPOOL, LNA
501 INTEGER(8) KEEP8(150)
502 INTEGER,
INTENT(IN) :: STEP(N)
503 INTEGER,
INTENT(IN) :: PROCNODE_STEPS(KEEP(28)), NA(LNA)
504 INTEGER,
INTENT(OUT) :: IPOOL(LPOOL)
505 INTEGER,
INTENT(OUT) :: MYROOT
506 INTEGER,
EXTERNAL :: MUMPS_PROCNODE
507 INTEGER :: NBLEAF, NBROOT, I, INODE
512 inode = na(nbleaf+i+2)
513 IF (mumps_procnode(procnode_steps(step(inode)),
514 & keep(199)) .EQ. myid_nodes)
THEN
516 ipool(myroot) = inode
522 & NA, LNA, KEEP, KEEP8, STEP, PROCNODE_STEPS,
523 & IPOOL, LPOOL, L0_OMP_MAPPING )
525 INTEGER,
INTENT(IN) :: N, MYID_NODES, LPOOL, LNA
527 INTEGER(8) KEEP8(150)
528 INTEGER,
INTENT(IN) :: STEP(N)
529 INTEGER,
INTENT(IN) :: PROCNODE_STEPS(KEEP(28)), NA(LNA)
530 INTEGER,
INTENT(IN) :: (KEEP(28))
531 INTEGER,
INTENT(OUT) :: IPOOL(LPOOL)
532 INTEGER,
INTENT(OUT) :: MYROOT
533 INTEGER,
EXTERNAL :: MUMPS_PROCNODE
534 INTEGER :: NBLEAF, NBROOT, I, INODE
539 inode = na(nbleaf+i+2)
540 IF (mumps_procnode(procnode_steps(step(inode)),
541 & keep(199)) .EQ. myid_nodes)
THEN
542 IF ( l0_omp_mapping(step(inode)).EQ.0 )
THEN
544 ipool(myroot) = inode
552 & NA, LNA, KEEP, KEEP8, STEP, PROCNODE_STEPS,
553 & IPOOL, LPOOL, L0_OMP_MAPPING, TO_PROCESS )
555 INTEGER,
INTENT(IN) :: N, MYID_NODES, LPOOL, LNA
557 INTEGER(8) KEEP8(150)
558 INTEGER,
INTENT(IN) :: STEP(N)
559 INTEGER,
INTENT(IN) :: PROCNODE_STEPS(KEEP(28)), NA(LNA)
560 INTEGER,
INTENT(IN) :: L0_OMP_MAPPING(KEEP(28))
561 INTEGER,
INTENT(OUT) :: IPOOL(LPOOL)
562 INTEGER,
INTENT(OUT) :: MYROOT
563 LOGICAL,
INTENT(IN) :: TO_PROCESS( KEEP(28) )
564 INTEGER,
EXTERNAL :: MUMPS_PROCNODE
565 INTEGER :: NBLEAF, NBROOT, I, INODE
570 inode = na(nbleaf+i+2)
571 IF (mumps_procnode(procnode_steps(step(inode)),
572 & keep(199)) .EQ. myid_nodes)
THEN
573 IF ( l0_omp_mapping(step(inode)).EQ.0 )
THEN
574 IF ( to_process( step(inode) ) )
THEN
576 ipool(myroot) = inode
585 & K199, NA, LNA, KEEP,KEEP8, STEP,
586 & PROCNODE_STEPS, IPOOL, LPOOL)
588 INTEGER N, LEAF, MYID_NODES,
591 INTEGER(8) KEEP8(150)
593 INTEGER PROCNODE_STEPS(KEEP(28)), NA(LNA),
595 INTEGER NBLEAF, INODE, I
596 INTEGER MUMPS_PROCNODE
597 EXTERNAL MUMPS_PROCNODE
602 IF (mumps_procnode(procnode_steps(step(inode)),keep(199))
603 & .EQ.myid_nodes)
THEN
612 & lleaves, leaves, keep,keep8, step,
613 & procnode_steps, ipool, lpool)
615 INTEGER N, LEAF, MYID_NODES,
618 INTEGER(8) KEEP8(150)
620 INTEGER (KEEP(28)), LEAVES(LLEAVES),
623 INTEGER,
EXTERNAL :: MUMPS_PROCNODE
627 IF ( mumps_procnode(procnode_steps(step(inode)),keep(199))
628 & .EQ.myid_nodes )
THEN
629 ipool( leaf ) = inode
636 & NROOT_LOC, MYID_NODES,
637 & SLAVEF, NA, LNA, KEEP, STEP,
640 INTEGER,
INTENT( OUT ) :: NROOT_LOC
641 INTEGER,
INTENT( OUT ) :: NBROOT
642 INTEGER,
INTENT( IN ) :: KEEP( 500 )
643 INTEGER,
INTENT( IN ) :: SLAVEF
644 INTEGER,
INTENT( IN ) :: N
645 INTEGER,
INTENT( IN ) :: STEP(N)
646 INTEGER,
INTENT( IN ) :: LNA
647 INTEGER,
INTENT( IN ) :: NA(LNA)
648 INTEGER,
INTENT( IN ) :: PROCNODE_STEPS(KEEP(28))
649 INTEGER,
INTENT( IN ) :: MYID_NODES
650 INTEGER,
EXTERNAL :: MUMPS_PROCNODE
651 INTEGER :: INODE, I, NBLEAF
656 inode = na(i+2+nbleaf)
657 IF (mumps_procnode(procnode_steps(step(inode)),
658 & keep(199)).EQ.myid_nodes)
THEN
659 nroot_loc = nroot_loc + 1
665 & (n, nbrorl, rorl_list,
666 & nrorl_loc, myid_nodes,
667 & slavef, keep, step,
670 INTEGER,
INTENT( OUT ) :: NRORL_LOC
671 INTEGER,
INTENT( IN ) :: NBRORL
672 INTEGER,
INTENT( IN ) :: RORL_LIST(NBRORL)
673 INTEGER,
INTENT( IN ) :: KEEP( 500 )
674 INTEGER,
INTENT( IN ) :: SLAVEF
675 INTEGER,
INTENT( IN ) :: N
676 INTEGER,
INTENT( IN ) :: STEP(N)
677 INTEGER,
INTENT( IN ) :: PROCNODE_STEPS(KEEP(28))
678 INTEGER,
INTENT( IN ) :: MYID_NODES
680 INTEGER,
EXTERNAL :: MUMPS_PROCNODE
684 IF (mumps_procnode(procnode_steps(step(inode)),
685 & keep(199)).EQ.myid_nodes)
THEN
686 nrorl_loc = nrorl_loc + 1
693 INTEGER len1 , len2 ,i
697 IF(len1 .NE. len2)
THEN
701 IF(tab1(i) .NE. tab2(i))
THEN
716 DO WHILE ( .NOT. done )
719 IF ( val( i ) .GT. val( i + 1 ) )
THEN
722 id( i ) = id( i + 1 )
725 val( i ) = val( i + 1 )
740 DO WHILE ( .NOT. done )
743 IF ( val( i ) .LT. val( i + 1 ) )
THEN
746 id( i ) = id( i + 1 )
749 val( i ) = val( i + 1 )
759 INTEGER(8) :: VAL( N )
764 DO WHILE ( .NOT. done )
767 IF ( val( i ) .GT. val( i + 1 ) )
THEN
770 id( i ) = id( i + 1 )
773 val( i ) = val( i + 1 )
781#if defined(PRINT_BACKTRACE_ON_ABORT)
782#if defined(__INTEL_COMPILER)
787 INTEGER IERR, IERRCODE
788#if defined(__GFORTRAN__)
791#if defined(__INTEL_COMPILER)
793 CALL tracebackqq(
"MUMPS_ABORT calls TRACEBACKQQ:",
800 INTEGER IERR, IERRCODE
803 CALL mpi_abort(mpi_comm_world, ierrcode, ierr)
807 & KEEP50,KEEP54,ICNTL6,ICNTL8)
809 INTEGER,
intent(out)::KEEP12
810 INTEGER,
intent(in)::ICNTL14,KEEP50,KEEP54,ICNTL6,ICNTL8
817 INTEGER ROOT, COMM, MPI_OP
820 DOUBLE PRECISION DIN, DOUT
823 CALL mpi_reduce(din, dout, 1, mpi_double_precision,
824 & mpi_op, root, comm, ierr)
834 DOUBLE PRECISION DIN, DOUT
838 & mpi_op, comm, ierr)
844 INTEGER ,
INTENT(OUT) :: I
845 INTEGER(8),
INTENT(IN) :: I8
846 IF ( i8 .GT. int(huge(i),8) )
THEN
847 i = -int(i8/1000000_8,kind(i))
855 INTEGER(8),
INTENT(IN) :: I8
856 CHARACTER(*),
INTENT(IN) :: STRING
858 IF ( i8 .GT. int(huge(i),8))
THEN
865 INTEGER(8),
INTENT(IN) :: SIZE8
866 INTEGER,
INTENT(OUT) :: IERROR
867 CALL MUMPS_SETI8TOI4(SIZE8, IERROR)
872 INTEGER(8),
intent(in) :: I8
873 INTEGER,
intent(out) :: INT_ARRAY(2)
874 INTEGER(kind(0_4)) :: I32
875 INTEGER(8) :: IDIV, IPAR
876 parameter(ipar=int(huge(i32),8))
877 parameter(idiv=ipar+1_8)
878 IF ( i8 .LT. idiv )
THEN
880 int_array(2) = int(i8)
882 int_array(1) = int(i8 / idiv)
883 int_array(2) = int(mod(i8,idiv))
889 INTEGER(8),
intent(out) :: I8
890 INTEGER,
intent(in) :: INT_ARRAY(2)
891 INTEGER(kind(0_4)) :: I32
892 INTEGER(8) :: IDIV, IPAR
893 parameter(ipar=int(huge(i32),8))
894 parameter(idiv=ipar+1_8)
895 IF ( int_array(1) .EQ. 0 )
THEN
896 i8=int(int_array(2),8)
898 i8=int(int_array(1),8)*idiv+int(int_array(2),8)
904 INTEGER(8),
intent(in) :: I8
905 INTEGER,
intent(inout) :: INT_ARRAY(2)
914 INTEGER(8),
intent(in) ::
915 INTEGER,
intent(inout) :: INT_ARRAY(2)
924 INTEGER,
INTENT(IN) :: icntl7
925 LOGICAL :: scotch=.false.
926 LOGICAL :: metis =.false.
927#if defined(metis) || defined(parmetis) || defined(metis4) || defined(parmetis3)
930#if defined(scotch) || defined(ptscotch)
933 IF ( icntl7 .LT. 0 .OR. icntl7 .GT. 7 )
THEN
944 CHARACTER :: which*(*)
945 LOGICAL :: ptscotch=.false., parmetis=.false.
949#if defined(parmetis) || defined(parmetis3)
953 CASE('ptscotch
','ptscotch
')
954 MUMPS_PARANA_AVAIL = PTSCOTCH
955 CASE('parmetis
','parmetis
')
956 MUMPS_PARANA_AVAIL = PARMETIS
958.AND.
MUMPS_PARANA_AVAIL = PTSCOTCH PARMETIS
960.OR.
MUMPS_PARANA_AVAIL = PTSCOTCH PARMETIS
962 write(*,'(
"Invalid input in MUMPS_PARANA_AVAIL")
')
965 END FUNCTION MUMPS_PARANA_AVAIL
966 SUBROUTINE MUMPS_SORT_STEP(N,FRERE,STEP,FILS,
967 & NA,LNA,NE,ND,DAD,LDAD,USE_DAD,
972 INTEGER N, NSTEPS, LNA, LP,LDAD
973 INTEGER FRERE(NSTEPS), FILS(N), STEP(N)
974 INTEGER NA(LNA), NE(NSTEPS), ND(NSTEPS)
978 INTEGER SLAVEF,PROCNODE(NSTEPS)
979 INTEGER POSTORDER,TMP_SWAP
980 INTEGER, DIMENSION (:), ALLOCATABLE :: STEP_TO_NODE
981 INTEGER, DIMENSION (:), ALLOCATABLE :: IPOOL,TNSTK
983 INTEGER NBLEAF,NBROOT,LEAF,IN,INODE,IFATH
984 EXTERNAL MUMPS_TYPENODE
985 INTEGER MUMPS_TYPENODE
989 ALLOCATE( IPOOL(NBLEAF), TNSTK(NSTEPS), stat=allocok )
990 IF (allocok > 0) THEN
1000 ALLOCATE(STEP_TO_NODE(NSTEPS),stat=allocok)
1001 IF (allocok > 0) THEN
1003 & WRITE(LP,*)'memory allocation error in
1010.GT.
IF(STEP(I)0)THEN
1011 STEP_TO_NODE(STEP(I))=I
1014 IPOOL(1:NBLEAF)=NA(3:2+NBLEAF)
1023 IFATH = DAD( STEP(INODE) )
1027.GT.
IF (IN0) GO TO 113
1030 TMP_SWAP=FRERE(STEP(INODE))
1031 FRERE(STEP(INODE))=FRERE(POSTORDER)
1032 FRERE(POSTORDER)=TMP_SWAP
1033 TMP_SWAP=ND(STEP(INODE))
1034 ND(STEP(INODE))=ND(POSTORDER)
1035 ND(POSTORDER)=TMP_SWAP
1036 TMP_SWAP=NE(STEP(INODE))
1037 NE(STEP(INODE))=NE(POSTORDER)
1038 NE(POSTORDER)=TMP_SWAP
1039 TMP_SWAP=PROCNODE(STEP(INODE))
1040 PROCNODE(STEP(INODE))=PROCNODE(POSTORDER)
1041 PROCNODE(POSTORDER)=TMP_SWAP
1043 TMP_SWAP=DAD(STEP(INODE))
1044 DAD(STEP(INODE))=DAD(POSTORDER)
1045 DAD(POSTORDER)=TMP_SWAP
1047 TMP_SWAP=TNSTK(STEP(INODE))
1048 TNSTK(STEP(INODE))=TNSTK(POSTORDER)
1049 TNSTK(POSTORDER)=TMP_SWAP
1050 II=STEP_TO_NODE(POSTORDER)
1051 TMP_SWAP=STEP(INODE)
1052 STEP(STEP_TO_NODE(POSTORDER))=TMP_SWAP
1053 STEP(INODE)=POSTORDER
1054 STEP_TO_NODE(POSTORDER)=INODE
1055 STEP_TO_NODE(TMP_SWAP)=II
1065 STEP(IN)=-STEP(INODE)
1068 POSTORDER = POSTORDER + 1
1069.EQ.
IF (IFATH0) THEN
1071.EQ.
IF (NBROOT0) GOTO 116
1074 TNSTK(STEP(IFATH)) = TNSTK(STEP(IFATH)) - 1
1075.EQ.
IF ( TNSTK(STEP(IFATH)) 0 ) THEN
1082 DEALLOCATE(STEP_TO_NODE)
1083 DEALLOCATE(IPOOL,TNSTK)
1085 END SUBROUTINE MUMPS_SORT_STEP
1086 SUBROUTINE MUMPS_CHECK_COMM_NODES(COMM_NODES, EXIT_FLAG)
1088 INTEGER, INTENT(IN) :: COMM_NODES
1089 LOGICAL, INTENT(OUT) :: EXIT_FLAG
1090 INCLUDE 'mumps_tags.h
'
1092 INTEGER :: STATUS(MPI_STATUS_SIZE), IERR
1093 CALL MPI_IPROBE( MPI_ANY_SOURCE, TERREUR, COMM_NODES,
1094 & EXIT_FLAG, STATUS, IERR)
1096 END SUBROUTINE MUMPS_CHECK_COMM_NODES
1097 SUBROUTINE MUMPS_GET_PROC_PER_NODE(K414, MyID, NbProcs, COMM)
1100 INTEGER :: K414, MyID, NbProcs, COMM, ALLOCOK
1101 INTEGER :: ierr,MyNAME_length,MyNAME_length_RCV,i,j
1102 CHARACTER(len=MPI_MAX_PROCESSOR_NAME) :: MyNAME
1103 CHARACTER, dimension(:), allocatable :: MyNAME_TAB,MyNAME_TAB_RCV
1104 logical :: SAME_NAME
1105 call MPI_GET_PROCESSOR_NAME(MyNAME, MyNAME_length, ierr)
1106 allocate(MyNAME_TAB(MyNAME_length), STAT=ALLOCOK)
1107.LT.
IF(ALLOCOK0) THEN
1108 write(*,*) "Allocation error in MUMPS_GET_PROC_PER_NODE"
1111 DO i=1, MyNAME_length
1112 MyNAME_TAB(i) = MyNAME(i:i)
1117 MyNAME_length_RCV = MyNAME_length
1119 MyNAME_length_RCV = 0
1121 call MPI_BCAST(MyNAME_length_RCV,1,MPI_INTEGER,
1123 allocate(MyNAME_TAB_RCV(MyNAME_length_RCV), STAT=ALLOCOK)
1124.LT.
IF(ALLOCOK0) THEN
1125 write(*,*) "Allocation error in MUMPS_GET_PROC_PER_NODE"
1129 MyNAME_TAB_RCV = MyNAME_TAB
1131 call MPI_BCAST(MyNAME_TAB_RCV,MyNAME_length_RCV,MPI_CHARACTER,
1134.EQ.
IF(MyNAME_length MyNAME_length_RCV) THEN
1135 DO j=1, MyNAME_length
1136.NE.
IF(MyNAME_TAB(j) MyNAME_TAB_RCV(j)) THEN
1143 IF(SAME_NAME) K414=K414+1
1144 deallocate(MyNAME_TAB_RCV)
1146 deallocate(MyNAME_TAB)
1147 END SUBROUTINE MUMPS_GET_PROC_PER_NODE
1148 SUBROUTINE MUMPS_ICOPY_32TO64 (INTAB, SIZETAB, OUTTAB8)
1149 INTEGER, intent(in) :: SIZETAB
1150 INTEGER, intent(in) :: INTAB(SIZETAB)
1151 INTEGER(8), intent(out) :: OUTTAB8(SIZETAB)
1154 OUTTAB8(I) = int(INTAB(I),8)
1157 END SUBROUTINE MUMPS_ICOPY_32TO64
1158 SUBROUTINE MUMPS_ICOPY_32TO64_64C(INTAB, SIZETAB8, OUTTAB8)
1159 INTEGER(8), intent(in) :: SIZETAB8
1160 INTEGER, intent(in) :: INTAB(SIZETAB8)
1161 INTEGER(8), intent(out) :: OUTTAB8(SIZETAB8)
1164.GE.
OMP_FLAG = (SIZETAB8 500000_8 )
1165!$OMP PARALLEL DO PRIVATE(I8)
1168 OUTTAB8(I8) = int(INTAB(I8),8)
1170!$OMP END PARALLEL DO
1172 END SUBROUTINE MUMPS_ICOPY_32TO64_64C
1173 SUBROUTINE MUMPS_ICOPY_32TO64_64C_IP(IN_OUT_TAB48, SIZETAB)
1174 INTEGER(8), intent(in) :: SIZETAB
1175 INTEGER, intent(inout) :: IN_OUT_TAB48(2*SIZETAB)
1176 CALL MUMPS_ICOPY_32TO64_64C_IP_REC(IN_OUT_TAB48, SIZETAB)
1178 END SUBROUTINE MUMPS_ICOPY_32TO64_64C_IP
1179 RECURSIVE SUBROUTINE MUMPS_ICOPY_32TO64_64C_IP_REC(
1180 & IN_OUT_TAB48, SIZETAB)
1182 INTEGER(8), intent(in) :: SIZETAB
1183 INTEGER :: IN_OUT_TAB48(2*SIZETAB)
1184 INTEGER(8) :: IBEG24, IBEG28, SIZE1, SIZE2
1185.LE.
IF (SIZETAB 1000_8) THEN
1186 CALL MUMPS_ICOPY_32TO64_64C_IP_C(IN_OUT_TAB48(1),
1190 SIZE1 = SIZETAB - SIZE2
1192 IBEG28 = 2*SIZE1+1_8
1193 CALL MUMPS_ICOPY_32TO64_64C(IN_OUT_TAB48(IBEG24),
1194 & SIZE2, IN_OUT_TAB48(IBEG28))
1195 CALL MUMPS_ICOPY_32TO64_64C_IP_REC(IN_OUT_TAB48,
1199 END SUBROUTINE MUMPS_ICOPY_32TO64_64C_IP_REC
1200 SUBROUTINE MUMPS_ICOPY_64TO32(INTAB8, SIZETAB, OUTTAB)
1201 INTEGER, intent(in) :: SIZETAB
1202 INTEGER(8), intent(in) :: INTAB8(SIZETAB)
1203 INTEGER, intent(out) :: OUTTAB(SIZETAB)
1206 OUTTAB(I) = int(INTAB8(I))
1209 END SUBROUTINE MUMPS_ICOPY_64TO32
1210 SUBROUTINE MUMPS_ICOPY_64TO32_64C (INTAB8, SIZETAB, OUTTAB)
1211 INTEGER(8), intent(in) :: SIZETAB
1212 INTEGER(8), intent(in) :: INTAB8(SIZETAB)
1213 INTEGER, intent(out) :: OUTTAB(SIZETAB)
1216 OUTTAB(I8) = int(INTAB8(I8))
1219 END SUBROUTINE MUMPS_ICOPY_64TO32_64C
1220 SUBROUTINE MUMPS_ICOPY_64TO32_64C_IP(IN_OUT_TAB48, SIZETAB)
1221 INTEGER(8), intent(in) :: SIZETAB
1222 INTEGER, intent(inout) :: IN_OUT_TAB48(2*SIZETAB)
1223 CALL MUMPS_ICOPY_64TO32_64C_IP_REC(IN_OUT_TAB48, SIZETAB)
1225 END SUBROUTINE MUMPS_ICOPY_64TO32_64C_IP
1226 RECURSIVE SUBROUTINE MUMPS_ICOPY_64TO32_64C_IP_REC(
1227 & IN_OUT_TAB48, SIZETAB)
1229 INTEGER(8), intent(in) :: SIZETAB
1230 INTEGER :: IN_OUT_TAB48(2*SIZETAB)
1231 INTEGER(8) :: IBEG24, IBEG28, SIZE1, SIZE2
1232.LE.
IF (SIZETAB 1000_8) THEN
1233 CALL MUMPS_ICOPY_64TO32_64C_IP_C(IN_OUT_TAB48(1),
1237 SIZE1 = SIZETAB - SIZE2
1239 IBEG28 = SIZE1 + SIZE1 + 1_8
1240 CALL MUMPS_ICOPY_64TO32_64C_IP_REC(IN_OUT_TAB48,
1242 CALL MUMPS_ICOPY_64TO32_64C(IN_OUT_TAB48(IBEG28),
1243 & SIZE2, IN_OUT_TAB48(IBEG24))
1246 END SUBROUTINE MUMPS_ICOPY_64TO32_64C_IP_REC
1247 SUBROUTINE MUMPS_GET_NNZ_INTERNAL( NNZ, NZ, NNZ_i )
1248 INTEGER , INTENT(IN) :: NZ
1249 INTEGER(8), INTENT(IN) :: NNZ
1250 INTEGER(8), INTENT(OUT) :: NNZ_i
1256 END SUBROUTINE MUMPS_GET_NNZ_INTERNAL
1257 SUBROUTINE MUMPS_NPIV_CRITICAL_PATH(
1258 & N, NSTEPS, STEP, FRERE, FILS,
1259 & NA, LNA, NE, MAXNPIVTREE )
1261 INTEGER, intent(in) :: N, NSTEPS, LNA
1262 INTEGER, intent(in) :: FRERE(NSTEPS), FILS(N), STEP(N)
1263 INTEGER, intent(in) :: NA(LNA), NE(NSTEPS)
1264 INTEGER, intent(out) :: MAXNPIVTREE
1265 INTEGER :: IFATH,INODE,ISON
1266 INTEGER :: NPIV,ILEAF,NBLEAF,NBROOT
1267 INTEGER, DIMENSION(:) , ALLOCATABLE :: MAXNPIV
1268 INTEGER :: I, allocok
1270 ALLOCATE ( MAXNPIV(NSTEPS), stat=allocok)
1271.gt.
IF (allocok 0) THEN
1281 DO ILEAF = 1, NBLEAF
1288.GT.
IF (ISON 0 ) GOTO 100
1290 MAXNPIV( STEP(INODE) ) = NPIV
1291 DO I = 1, NE(STEP(INODE))
1292 MAXNPIV(STEP(INODE)) = max( MAXNPIV(STEP(INODE)),
1293 & NPIV + MAXNPIV(STEP(ISON)) )
1294 ISON = FRERE(STEP(ISON))
1297.GT.
DO WHILE (IFATH 0)
1298 IFATH = FRERE(STEP(IFATH))
1301.EQ.
IF (IFATH0) THEN
1302 MAXNPIVTREE = max(MAXNPIVTREE, MAXNPIV(STEP(INODE)))
1304.LT.
IF (FRERE(STEP(INODE)) 0) THEN
1310 DEALLOCATE( MAXNPIV )
1312 END SUBROUTINE MUMPS_NPIV_CRITICAL_PATH
1313 SUBROUTINE MUMPS_LDLTPANEL_NBTARGET( NPIV, NB_TARGET, KEEP )
1315 INTEGER, INTENT(IN) :: NPIV
1316 INTEGER, INTENT(IN) :: KEEP(500)
1317 INTEGER, INTENT(OUT) :: NB_TARGET
1318 INTEGER :: NBPANELS, NBCOLMIN, NBPANELSMAX
1319.EQ.
IF (NPIV 0) THEN
1322 NBCOLMIN = KEEP(460)
1323 NBPANELSMAX = KEEP(459)
1324 NBPANELS = min( (NPIV+NBCOLMIN-1) / NBCOLMIN, NBPANELSMAX )
1325 NB_TARGET = ( NPIV+NBPANELS-1 ) / NBPANELS
1328 END SUBROUTINE MUMPS_LDLTPANEL_NBTARGET
1329 SUBROUTINE MUMPS_LDLTPANEL_STORAGE
1330 & ( NPIV, KEEP, IW, NB_ENTRIES )
1332 INTEGER, INTENT(IN) :: NPIV
1333 INTEGER, INTENT(IN) :: KEEP(500), IW(*)
1334 INTEGER(8), INTENT(OUT) :: NB_ENTRIES
1335 INTEGER :: NB_TARGET, NBCOLS_PANEL, NBROWS_PANEL
1336 INTEGER :: ICOL_BEG, ICOL_END, NBPANELS
1337 CALL MUMPS_LDLTPANEL_NBTARGET( NPIV, NB_TARGET, KEEP )
1342.LE.
DO WHILE ( ICOL_BEG NPIV )
1343 NBPANELS = NBPANELS + 1
1344 ICOL_END = min(NB_TARGET * NBPANELS, NPIV)
1345.NE.
IF (IW(1) 0) THEN
1346 IF ( IW( ICOL_END ) < 0 ) THEN
1347 ICOL_END = ICOL_END + 1
1350 NBCOLS_PANEL = ICOL_END - ICOL_BEG + 1
1351 NB_ENTRIES = NB_ENTRIES + int(NBCOLS_PANEL,8) *
1352 & int(NBROWS_PANEL,8)
1353 NBROWS_PANEL = NBROWS_PANEL - NBCOLS_PANEL
1354 ICOL_BEG = ICOL_END + 1
1357 END SUBROUTINE MUMPS_LDLTPANEL_STORAGE
1358 SUBROUTINE MUMPS_LDLTPANEL_PANELINFOS( NPIV, KEEP, IW,
1359 & NB_TARGET, NBPANELS, PANEL_COL, PANEL_POS, PANEL_TABSIZE,
1362 INTEGER, INTENT(IN) :: NPIV
1363 INTEGER, INTENT(IN) :: IW( NPIV )
1364 INTEGER, INTENT(IN) :: KEEP(500)
1365 INTEGER, INTENT(IN) :: PANEL_TABSIZE
1366 INTEGER, INTENT(OUT) :: NB_TARGET, NBPANELS
1367 INTEGER, INTENT(OUT) :: PANEL_COL( PANEL_TABSIZE )
1368 INTEGER(8), INTENT(OUT) :: PANEL_POS( PANEL_TABSIZE )
1369 LOGICAL, INTENT(IN) :: IGNORE_K459
1370 INTEGER :: IPANEL, ICOL_END, NBROWS_PANEL, NBCOLS_PANEL
1371 IF ( IGNORE_K459 ) THEN
1374 CALL MUMPS_LDLTPANEL_NBTARGET( NPIV, NB_TARGET, KEEP )
1380.GT..AND..NE..AND.
IF ( KEEP(459) 1 KEEP(50) 0
1381.NE.
& NB_TARGETNPIV ) THEN
1382 NBPANELS = ( NPIV + NB_TARGET -1 ) / NB_TARGET
1383.LT.
IF ( PANEL_TABSIZE NBPANELS + 1 ) THEN
1384 WRITE(*,*) " Internal error in MUMPS_LDLTPANEL_PANELINFOS",
1385 & PANEL_TABSIZE, NBPANELS
1388 DO IPANEL=1, NBPANELS
1389 ICOL_END = min(IPANEL*NB_TARGET, NPIV)
1390.LT.
IF ( IW(ICOL_END) 0 ) THEN
1391 ICOL_END = ICOL_END + 1
1393 NBCOLS_PANEL = ICOL_END - PANEL_COL(IPANEL) + 1
1394 PANEL_POS(IPANEL+1) = PANEL_POS(IPANEL) +
1395 & int(NBROWS_PANEL,8)*int(NBCOLS_PANEL,8)
1396 PANEL_COL(IPANEL+1) = PANEL_COL(IPANEL) + NBCOLS_PANEL
1397 NBROWS_PANEL = NBROWS_PANEL - NBCOLS_PANEL
1400 PANEL_POS(2) = int(NPIV,8)*int(NPIV,8)+1_8
1401 PANEL_COL(2) = NPIV+1
1403 END SUBROUTINE MUMPS_LDLTPANEL_PANELINFOS
1404 SUBROUTINE MUMPS_LDLTPANEL_SIZES
1405 & ( NPIV, KEEP, IW, PANEL_SIZES, NBPANELS )
1407 INTEGER, INTENT(IN) :: NPIV
1408 INTEGER, INTENT(IN) :: KEEP(500), IW(NPIV)
1409 INTEGER(8), INTENT(OUT) :: PANEL_SIZES( KEEP(459) )
1410 INTEGER, INTENT(OUT) :: NBPANELS
1411 INTEGER :: NB_TARGET
1412 INTEGER :: ICOL_BEG, ICOL_END
1414 CALL MUMPS_LDLTPANEL_NBTARGET( NPIV, NB_TARGET, KEEP )
1417.LE.
DO WHILE ( ICOL_BEG NPIV )
1418 NBPANELS = NBPANELS + 1
1419 ICOL_END = min(NB_TARGET * NBPANELS, NPIV)
1420 IF ( IW( ICOL_END ) < 0 ) THEN
1421 ICOL_END = ICOL_END + 1
1423 PANEL_SIZES(NBPANELS) = ICOL_END-ICOL_BEG+1
1424 ICOL_BEG = ICOL_END + 1
1426 PANEL_SIZES(NBPANELS+1:KEEP(459))=0
1428 END SUBROUTINE MUMPS_LDLTPANEL_SIZES
1429 SUBROUTINE MUMPS_BUILD_ARCH_NODE_COMM
1430 & ( COMM, NEWCOMM, NEWSIZE, NEWRANK )
1433 INTEGER, INTENT(IN) :: COMM
1434 INTEGER, INTENT(OUT) :: NEWCOMM, NEWSIZE, NEWRANK
1435 INTEGER :: SMALLEST_ID_ON_SAME_NODE, IPROC, MYID, IERR, NPROCS
1436 INTEGER :: TMPNAME_LENGTH, MYNAME_LENGTH
1437 CHARACTER(len=MPI_MAX_PROCESSOR_NAME) :: MYNAME, TMPNAME
1438 SMALLEST_ID_ON_SAME_NODE = -1
1439 CALL MPI_COMM_RANK( COMM, MYID, IERR )
1440 CALL MPI_COMM_SIZE( COMM, NPROCS, IERR )
1441 CALL MPI_GET_PROCESSOR_NAME(MYNAME, MYNAME_LENGTH, IERR )
1442 DO IPROC = 0, NPROCS - 1
1443.EQ.
IF (MYID IPROC) THEN
1445 TMPNAME_LENGTH = MYNAME_LENGTH
1447 CALL MPI_BCAST( TMPNAME_LENGTH, 1, MPI_INTEGER,
1448 & IPROC, COMM, IERR )
1449 CALL MPI_BCAST( TMPNAME, TMPNAME_LENGTH, MPI_CHARACTER,
1450 & IPROC, COMM, IERR)
1451.LT.
IF (SMALLEST_ID_ON_SAME_NODE 0) THEN
1452.EQ.
IF ( TMPNAME_LENGTH MYNAME_LENGTH ) THEN
1453.EQ.
IF ( TMPNAME(1:TMPNAME_LENGTH) MYNAME(1:MYNAME_LENGTH) )
1455 SMALLEST_ID_ON_SAME_NODE = IPROC
1460 CALL MPI_COMM_SPLIT( COMM, SMALLEST_ID_ON_SAME_NODE, 0,
1462 CALL MPI_COMM_RANK( NEWCOMM, NEWRANK, IERR )
1463 CALL MPI_COMM_SIZE( NEWCOMM, NEWSIZE, IERR )
1465 END SUBROUTINE MUMPS_BUILD_ARCH_NODE_COMM
1466 SUBROUTINE MUMPS_DESTROY_ARCH_NODE_COMM( ARCH_NODE_COMM )
1468 INTEGER :: ARCH_NODE_COMM, IERR
1470 CALL MPI_COMM_FREE( ARCH_NODE_COMM, IERR )
1472 END SUBROUTINE MUMPS_DESTROY_ARCH_NODE_COMM
1473 SUBROUTINE MUMPS_DM_FAC_UPD_DYN_MEMCNTS
1474 & ( MEM_COUNT_ALLOCATED, ATOMIC_UPDATES, KEEP8,
1475 & IFLAG, IERROR, K69UPD, K71UPD )
1477 INTEGER(8), INTENT(IN) :: MEM_COUNT_ALLOCATED
1478 INTEGER(8), INTENT(INOUT) :: KEEP8(150)
1479 LOGICAL, INTENT(IN) :: ATOMIC_UPDATES
1480 INTEGER, INTENT(INOUT) :: IFLAG, IERROR
1481 LOGICAL, INTENT(IN) :: K69UPD
1482 LOGICAL, INTENT(IN) :: K71UPD
1483 INTEGER(8) :: KEEP8TMPCOPY
1484.GT.
IF (MEM_COUNT_ALLOCATED0) THEN
1485 IF (ATOMIC_UPDATES ) THEN
1487 KEEP8(73) = KEEP8(73) + MEM_COUNT_ALLOCATED
1488 KEEP8TMPCOPY = KEEP8(73)
1491 KEEP8(74) = max(KEEP8(74), KEEP8TMPCOPY)
1494 KEEP8(73) = KEEP8(73) + MEM_COUNT_ALLOCATED
1495 KEEP8TMPCOPY = KEEP8(73)
1496 KEEP8(74) = max(KEEP8(74), KEEP8(73))
1498.GT.
IF ( KEEP8TMPCOPY KEEP8(75) ) THEN
1500 CALL MUMPS_SET_IERROR(
1501 & (KEEP8TMPCOPY-KEEP8(75)), IERROR)
1504 IF ( ATOMIC_UPDATES ) THEN
1506 KEEP8(69) = KEEP8(69) + MEM_COUNT_ALLOCATED
1507 KEEP8TMPCOPY = KEEP8(69)
1510 KEEP8(68) = max(KEEP8(68), KEEP8TMPCOPY)
1513 KEEP8(69) = KEEP8(69) + MEM_COUNT_ALLOCATED
1514 KEEP8(68) = max(KEEP8(69), KEEP8(68))
1518 IF ( ATOMIC_UPDATES ) THEN
1520 KEEP8(71) = KEEP8(71) + MEM_COUNT_ALLOCATED
1521 KEEP8TMPCOPY = KEEP8(71)
1524 KEEP8(70) = max(KEEP8(70), KEEP8TMPCOPY)
1527 KEEP8(71) = KEEP8(71) + MEM_COUNT_ALLOCATED
1528 KEEP8(70) = max(KEEP8(71), KEEP8(70))
1532 IF (ATOMIC_UPDATES) THEN
1534 KEEP8(73) = KEEP8(73) + MEM_COUNT_ALLOCATED
1538 KEEP8(69) = KEEP8(69) + MEM_COUNT_ALLOCATED
1543 KEEP8(71) = KEEP8(71) + MEM_COUNT_ALLOCATED
1547 KEEP8(73) = KEEP8(73) + MEM_COUNT_ALLOCATED
1549 KEEP8(69) = KEEP8(69) + MEM_COUNT_ALLOCATED
1552 KEEP8(71) = KEEP8(71) + MEM_COUNT_ALLOCATED
1557 END SUBROUTINE MUMPS_DM_FAC_UPD_DYN_MEMCNTS
1558 SUBROUTINE MUMPS_SET_PARTI_REGULAR(
1562 & MEM_DISTRIB, NCB, NFRONT, NSLAVES_NODE,
1563 & TAB_POS, SLAVES_LIST, SIZE_SLAVES_LIST,MYID,INODE,
1564 & TAB_MAXS_ARG,SUP_PROC_ARG,MAX_SURF,NB_ROW_MAX
1567 INTEGER, intent(in) :: KEEP(500),SIZE_SLAVES_LIST
1568 INTEGER(8) KEEP8(150)
1569 INTEGER, intent(in) :: SLAVEF, NFRONT, NCB,MYID
1570 INTEGER, intent(in) :: PROCS(SLAVEF+1)
1571 INTEGER(8), intent(in) :: TAB_MAXS_ARG(0:SLAVEF-1)
1572 INTEGER, intent(in) :: SUP_PROC_ARG(2)
1573 INTEGER, intent(in) :: MEM_DISTRIB(0:SLAVEF-1),INODE
1574 INTEGER, intent(out):: SLAVES_LIST(SIZE_SLAVES_LIST)
1575 INTEGER, intent(out):: TAB_POS(SLAVEF+2)
1576 INTEGER, intent(out):: NSLAVES_NODE,NB_ROW_MAX
1577 INTEGER(8), intent(out):: MAX_SURF
1578 LOGICAL :: FORCE_LDLTRegular_NIV2
1580 INTEGER i,J,NELIM,NB_SUP,K50,NB_ROWS(PROCS(SLAVEF+1))
1581 INTEGER TMP_NROW,X,K
1582 LOGICAL SUP,MEM_CSTR
1583 DOUBLE PRECISION MAX_LOAD,TOTAL_LOAD,VAR,TMP,A,B,C,DELTA,
1585 INTEGER IDWLOAD(SLAVEF)
1586 INTEGER(8) MEM_CONSTRAINT(2)
1588 FORCE_LDLTRegular_NIV2 = .FALSE.
1595.NE.
IF(SUP_PROC_ARG(1)
1597 MEM_CONSTRAINT(1)=TAB_MAXS_ARG(PROCS(1))
1598 TOTAL_LOAD=TOTAL_LOAD+dble(SUP_PROC_ARG(1))/100.0D0
1601.NE.
IF(SUP_PROC_ARG(2)
1603 MEM_CONSTRAINT(2)=TAB_MAXS_ARG(PROCS(PROCS(SLAVEF+1)))
1604 TOTAL_LOAD=TOTAL_LOAD+dble(SUP_PROC_ARG(2))/100.0D0
1607 TOTAL_LOAD=TOTAL_LOAD+(PROCS(SLAVEF+1)-NB_SUP)
1609 MAX_LOAD=dble( NELIM ) * dble ( NCB ) +
1610 * dble(NCB) * dble(NELIM)*dble(2*NFRONT-NELIM-1)
1612 MAX_LOAD=dble(NELIM) * dble ( NCB ) *
1615 TMP=min(MAX_LOAD,MAX_LOAD/TOTAL_LOAD)
1617 DO i=1,PROCS(SLAVEF+1)
1618.GT..AND..EQ.
IF((NB_SUP0)(i1))THEN
1620.EQ..AND..EQ.
ELSEIF((NB_SUP2)(iPROCS(SLAVEF+1)))THEN
1630 IDWLOAD(J)=PROCS(PROCS(SLAVEF+1))
1634.EQ..OR.
IF ((K500)FORCE_LDLTRegular_NIV2) THEN
1636 J=PROCS(SLAVEF+1)-NB_SUP+1
1638 VAR=dble(SUP_PROC_ARG(i))/100.0D0
1639 TMP_NROW=int(dble(MEM_CONSTRAINT(i))/dble(NFRONT))
1640 NB_ROWS(J)=int(max((VAR*dble(TMP))/
1641 & (dble(NELIM)*dble(2*NFRONT-NELIM)),
1643.GT.
IF(NB_ROWS(J)TMP_NROW)THEN
1646.LT.
IF(NCB-ACCNB_ROWS(J)) THEN
1657 DO i=1,PROCS(SLAVEF+1)-NB_SUP
1659 TMP_NROW=int((dble(TAB_MAXS_ARG(IDWLOAD(i))))/dble(NFRONT))
1660 NB_ROWS(i)=int((dble(VAR)*dble(TMP))/
1661 & (dble(NELIM)*dble(2*NFRONT-NELIM)))
1662.GT.
IF(NB_ROWS(i)TMP_NROW)THEN
1665.LT.
IF(NCB-ACCNB_ROWS(i)) THEN
1673.EQ.
IF(PROCS(SLAVEF+1)NB_SUP)THEN
1674 TMP_NROW=(NCB-ACC)/PROCS(SLAVEF+1)+1
1675 DO i=1,PROCS(SLAVEF+1)
1676 NB_ROWS(i)=NB_ROWS(i)+TMP_NROW
1677.GT.
IF(ACC+TMP_NROWNCB)THEN
1678 NB_ROWS(i)=NB_ROWS(i)-TMP_NROW+NCB-ACC
1685 TMP_NROW=(NCB-ACC)/(PROCS(SLAVEF+1)-NB_SUP)+1
1686 DO i=1,PROCS(SLAVEF+1)-NB_SUP
1687 NB_ROWS(i)=NB_ROWS(i)+TMP_NROW
1690 NB_ROWS(i)=NB_ROWS(i)-TMP_NROW+
1691 & (NCB-(ACC-TMP_NROW))
1699 i=PROCS(SLAVEF+1)-NB_SUP+1
1704 VAR=DBLE(SUP_PROC_ARG(J))/DBLE(100)
1707 C=-dble(max(MEM_CONSTRAINT(J),0_8))
1708 DELTA=((B*B)-(4*A*C))
1709 TMP_NROW=int((-B+sqrt(DELTA))/(2*A))
1711 B=dble(NELIM)*(dble(-NELIM)+dble(2*(X+NELIM)+1))
1714 NB_ROWS(i)=int((-B+sqrt(DELTA))/(2*A))
1715.GT.
IF(NB_ROWS(i)TMP_NROW)THEN
1719.GT.
IF(ACC+NB_ROWS(i)NCB)THEN
1727 LOAD_CORR=LOAD_CORR+(dble(NELIM) * dble (NB_ROWS(i)) *
1728 * dble(2*(X+NELIM) - NELIM - NB_ROWS(i) + 1))
1734.NE..AND.
IF((PROCS(SLAVEF+1)NB_SUP)MEM_CSTR)THEN
1735 TMP=(MAX_LOAD-LOAD_CORR)/(PROCS(SLAVEF+1)-NB_SUP)
1739 DO i=1,PROCS(SLAVEF+1)-NB_SUP
1740.EQ.
IF (KEEP(375) 1) THEN
1743 B=dble(NELIM)*(dble(NELIM)+dble(2*ACC+1))
1750 DELTA=((B*B)-(4*A*C))
1751 NB_ROWS(i)=int((-B+sqrt(DELTA))/(2*A))
1752.LT.
IF(NCB-ACC-XNB_ROWS(i))THEN
1753 NB_ROWS(i)=NCB-ACC-X
1761.EQ.
IF(PROCS(SLAVEF+1)NB_SUP)THEN
1762 TMP_NROW=(NCB-ACC)/PROCS(SLAVEF+1)+1
1763 DO i=1,PROCS(SLAVEF+1)
1764 NB_ROWS(i)=NB_ROWS(i)+TMP_NROW
1765.GT.
IF(ACC+TMP_NROWNCB)THEN
1766 NB_ROWS(i)=NB_ROWS(i)-TMP_NROW+NCB-ACC
1773 NB_ROWS(PROCS(SLAVEF+1)-NB_SUP)=
1774 & NB_ROWS(PROCS(SLAVEF+1)
1784 DO i=1,PROCS(SLAVEF+1)
1785.NE.
IF(NB_ROWS(i)0)THEN
1786 SLAVES_LIST(J)=IDWLOAD(i)
1789 NB_ROW_MAX=max(NB_ROW_MAX,NB_ROWS(i))
1791 MAX_SURF=max(int(NB_ROWS(i),8)*int(NCB,8),int(0,8))
1793 MAX_SURF=max(int(NB_ROWS(i),8)*int(ACC,8),int(0,8))
1798 SLAVES_LIST(PROCS(SLAVEF+1)-K+1)=IDWLOAD(i)
1802 TAB_POS(SLAVEF+2) = NSLAVES
1803 TAB_POS(NSLAVES+1)= NCB+1
1804 NSLAVES_NODE=NSLAVES
1805 END SUBROUTINE MUMPS_SET_PARTI_REGULAR
subroutine mpi_reduce(sendbuf, recvbuf, cnt, datatype, op, root, comm, ierr)
subroutine mpi_allreduce(sendbuf, recvbuf, cnt, datatype, operation, comm, ierr)
subroutine pxerbla(contxt, srname, info)
subroutine descinit(desc, m, n, mb, nb, irsrc, icsrc, ictxt, lld, info)
subroutine mpi_abort(comm, ierrcode, ierr)