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( N ), FILS( N )
36 INTEGER,
intent( out ) :: THEROOT
37 INTEGER INODE, IROOT, 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) :: , 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
176 IF (tpn < 1 ) tpn = 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 tpn, 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, KEEP28, 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 ( 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
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, MYROW, 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-
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
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 :: TEMP1(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) :: L0_OMP_MAPPING(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((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, , 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)
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
611 & (n, leaf, myid_nodes,
612 & lleaves, leaves, keep,keep8, step,
613 & procnode_steps, ipool, lpool)
615 INTEGER N, LEAF, MYID_NODES,
618 INTEGER(8) KEEP8(150)
620 INTEGER PROCNODE_STEPS(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, )
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) :: I8
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')
955 CASE(
'parmetis',
'PARMETIS')
962 write(*,
'("Invalid input in MUMPS_PARANA_AVAIL")')
967 & NA,LNA,NE,ND,DAD,LDAD,USE_DAD,
972 INTEGER , , LNA, LP,LDAD
973 INTEGER FRERE(NSTEPS), FILS(N), STEP(N)
974 INTEGER NA(LNA), NE(NSTEPS), ND(NSTEPS)
978 INTEGER SLAVEF,PROCNODE()
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
992 &
WRITE(lp,*)
'Memory allocation error in MUMPS_SORT_STEP'
1000 ALLOCATE(step_to_node(nsteps),stat=allocok)
1001 IF (allocok > 0)
THEN
1003 &
WRITE(lp,*)
'Memory allocation error in
1010 IF(step(i).GT.0)
THEN
1011 step_to_node(step(i))=i
1014 ipool(1:nbleaf)=na(3:2+nbleaf)
1023 ifath = dad( step(inode) )
1027 IF (in.GT.0)
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
1058 IF (in .GT. 0 )
THEN
1064 IF (in .GT. 0 )
THEN
1065 step(in)=-step(inode)
1068 postorder = postorder + 1
1069 IF (ifath.EQ.0)
THEN
1071 IF (nbroot.EQ.0)
GOTO 116
1074 tnstk(step(ifath)) = tnstk(step(ifath)) - 1
1075 IF ( tnstk(step(ifath)) .EQ. 0 )
THEN
1082 DEALLOCATE(step_to_node)
1083 DEALLOCATE(ipool,tnstk)
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)
1100 INTEGER :: K414, MyID, NbProcs, COMM, ALLOCOK
1102CHARACTER(len=MPI_MAX_PROCESSOR_NAME) :: MyNAME
1103 CHARACTER,
dimension(:),
allocatable :: MyNAME_TAB,MyNAME_TAB_RCV
1104 logical :: SAME_NAME
1106 allocate(myname_tab(myname_length), stat=allocok)
1107 IF(allocok.LT.0)
THEN
1108 write(*,*)
"Allocation error in MUMPS_GET_PROC_PER_NODE"
1111 DO i=1, myname_length
1112 myname_tab(i) = myname(i:i)
1116 if(myid .eq. i)
then
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 IF(allocok.LT.0)
THEN
1125 write(*,*)
"Allocation error in MUMPS_GET_PROC_PER_NODE"
1128 if(myid .eq. i)
then
1129 myname_tab_rcv = myname_tab
1131 call mpi_bcast(myname_tab_rcv,myname_length_rcv,mpi_character,
1134 IF(myname_length .EQ. myname_length_rcv)
THEN
1135 DO j=1, myname_length
1136 IF(myname_tab(j) .NE. myname_tab_rcv(j))
THEN
1143 IF(same_name) k414=k414+1
1144 deallocate(myname_tab_rcv)
1146 deallocate(myname_tab)
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)
1159 INTEGER(8),
intent(in) :: SIZETAB8
1160 INTEGER,
intent(in) :: INTAB(SIZETAB8)
1161 INTEGER(8),
intent(out) :: OUTTAB8(SIZETAB8)
1164 omp_flag = (sizetab8 .GE.500000_8 )
1168 outtab8(i8) = int(intab(i8),8)
1174 INTEGER(8),
intent(in) :: SIZETAB
1175 INTEGER,
intent(inout) :: IN_OUT_TAB48(2*SIZETAB)
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 IF (sizetab.LE. 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
1194 & size2, in_out_tab48(ibeg28))
1201 INTEGER,
intent(in) :: SIZETAB
1202 INTEGER(8),
intent(in) :: INTAB8(SIZETAB)
1203 INTEGER,
intent(out) :: OUTTAB()
1206 outtab(i) = int(intab8(i))
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))
1221 INTEGER(8),
intent(in) :: SIZETAB
1222 INTEGER,
intent(inout) :: IN_OUT_TAB48(2*SIZETAB)
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 IF (sizetab.LE. 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
1243 & size2, in_out_tab48(ibeg24))
1248 INTEGER ,
INTENT(IN) :: NZ
1249 INTEGER(8),
INTENT(IN) :: NNZ
1250 INTEGER(8),
INTENT(OUT) :: NNZ_i
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 IF (allocok .gt.0)
THEN
1272 WRITE(*, *)
'Allocation error in MUMPS_NPIV_CRITICAL_PATH'
1281 DO ileaf = 1, nbleaf
1288 IF (ison .GT. 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 DO WHILE (ifath .GT. 0)
1298 ifath = frere(step(ifath))
1301 IF (ifath.EQ.0)
THEN
1302 maxnpivtree =
max(maxnpivtree, maxnpiv(step(inode)))
1304 IF (frere(step(inode)) .LT. 0)
THEN
1310 DEALLOCATE( maxnpiv )
1315 INTEGER,
INTENT(IN) :: NPIV
1316 INTEGER,
INTENT(IN) :: KEEP(500)
1317 INTEGER,
INTENT(OUT) :: NB_TARGET
1318 INTEGER :: NBPANELS, , NBPANELSMAX
1319 IF (npiv .EQ. 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
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,
1336 INTEGER :: ICOL_BEG, ICOL_END, NBPANELS
1342 DO WHILE ( icol_beg .LE. npiv )
1343 nbpanels = nbpanels + 1
1344 icol_end =
min(nb_target * nbpanels, npiv)
1345 IF (iw(1) .NE. 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
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
1380 IF ( keep(459) .GT. 1 .AND. keep(50) .NE. 0 .AND.
1381 & nb_target.NE.npiv )
THEN
1382 nbpanels = ( npiv + nb_target -1 ) / nb_target
1383 IF ( panel_tabsize .LT. 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 IF ( iw(icol_end) .LT. 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
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
1417 DO WHILE ( icol_beg .LE. 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
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
1442 DO iproc = 0, nprocs - 1
1443 IF (myid .EQ. 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 IF (smallest_id_on_same_node .LT. 0)
THEN
1452 IF ( tmpname_length .EQ. myname_length )
THEN
1453 IF ( tmpname(1:tmpname_length) .EQ. myname(1:myname_length) )
1455 smallest_id_on_same_node = iproc
1468 INTEGER :: ARCH_NODE_COMM, IERR
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 IF (mem_count_allocated.GT.0)
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 IF ( keep8tmpcopy .GT. keep8(75) )
THEN
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
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 IF(sup_proc_arg(1).NE.
1597 mem_constraint(1)=tab_maxs_arg(procs(1))
1598 total_load=total_load+dble(sup_proc_arg(1))/100.0d0
1601 IF(sup_proc_arg(2).NE.
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 IF((nb_sup.GT.0).AND.(i.EQ.1))
THEN
1620 ELSEIF((nb_sup.EQ.2).AND.(i.EQ.procs(slavef+1)))
THEN
1630 idwload(j)=procs(procs(slavef+1))
1634 IF ((k50.EQ.0).OR.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
1643 IF(nb_rows(j).GT.tmp_nrow)
THEN
1646 IF(ncb-acc.LT.nb_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 IF(nb_rows(i).GT.tmp_nrow)
THEN
1665 IF(ncb-acc.LT.nb_rows(i))
THEN
1673 IF(procs(slavef+1).EQ.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 IF(acc+tmp_nrow.GT.ncb)
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 IF(nb_rows(i).GT.tmp_nrow)
THEN
1719 IF(acc+nb_rows(i).GT.ncb)
THEN
1727 load_corr=load_corr+(dble(nelim) * dble(nb_rows(i)) *
1728 * dble(2*(x+nelim) - nelim - nb_rows(i) + 1))
1734 IF((procs(slavef+1).NE.nb_sup).AND.mem_cstr)
THEN
1735 tmp=(max_load-load_corr)/(procs(slavef+1)-nb_sup)
1739 DO i=1,procs(slavef+1)-nb_sup
1740 IF (keep(375) .EQ. 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 IF(ncb-acc-x.LT.nb_rows(i))
THEN
1753 nb_rows(i)=ncb-acc-x
1761 IF(procs(slavef+1).EQ.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 IF(acc+tmp_nrow.GT.ncb)
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 IF(nb_rows(i).NE.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
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
subroutine mpi_iprobe(source, tag, comm, flag, status, ierr)
subroutine mpi_reduce(sendbuf, recvbuf, cnt, datatype, op, root, comm, ierr)
subroutine mpi_comm_split(comm, color, key, comm2, ierr)
subroutine mpi_allreduce(sendbuf, recvbuf, cnt, datatype, operation, comm, ierr)
subroutine mpi_get_processor_name(name, resultlen, ierror)
subroutine pxerbla(contxt, srname, info)
subroutine mpi_comm_size(comm, size, ierr)
subroutine mpi_bcast(buffer, cnt, datatype, root, comm, ierr)
subroutine mpi_comm_free(comm, ierr)
subroutine descinit(desc, m, n, mb, nb, irsrc, icsrc, ictxt, lld, info)
subroutine mpi_comm_rank(comm, rank, ierr)
subroutine mpi_abort(comm, ierrcode, ierr)
subroutine blacs_gridinfo(cntxt, nprow, npcol, myrow, mycol)