26 INTEGER,
POINTER :: permtab(:) => null()
27 INTEGER,
POINTER :: peritab(:) => null()
28 INTEGER,
POINTER :: rangtab(:) => null()
29 INTEGER,
POINTER :: treetab(:) => null()
30 INTEGER,
POINTER :: brother(:) => null()
31 INTEGER,
POINTER :: son(:) => null()
32 INTEGER,
POINTER :: nw(:) => null()
33 INTEGER,
POINTER :: first(:) => null
34 INTEGER,
POINTER :: last(:) => null()
35 INTEGER,
POINTER :: topnodes(:) => null()
36 INTEGER :: comm, comm_nodes, nprocs, nslaves, myid
37 INTEGER :: topstrat, substrat, , topvars
43 INTEGER,
POINTER :: irn_loc(:) => null()
44 INTEGER,
POINTER :: jcn_loc(:) => null()
47 INTEGER,
POINTER :: buf(:) => null()
57 TYPE(cmumps_struc) :: id
58 INTEGER,
TARGET :: WORK1(:), WORK2(:)
59 INTEGER :: NFSIZ(:), FILS(:), FRERE(:)
61 INTEGER,
POINTER :: IPE(:), NV(:),
62 & ne(:), na(:), node(:),
63 & nd(:), subord(:), namalg(:),
65 & saveirn(:), savejcn(:)
66 INTEGER :: MYID, NPROCS, IERR, NEMIN, LDIAG
68 INTEGER(8),
PARAMETER :: K79REF=12000000_8
69 INTEGER,
PARAMETER :: LIDUMMY = 1
71 DOUBLE PRECISION :: TIMEB
72 nullify(ipe, nv, ne, na, node, nd, subord, namalg, ips,
73 & cumul, saveirn, savejcn)
81 lpok = (
lp.GT.0) .AND. (id%ICNTL(4).GE.1)
83 ord%PERMTAB => work1(1 : id%N)
84 ord%PERITAB => work1(id%N+1 : 2*id%N)
85 ord%TREETAB => work1(2*id%N+1 : 3*id%N)
86 IF(id%KEEP(54) .NE. 3)
THEN
92 id%KEEP8(29) = id%KEEP8(28)
100 id%INFOG(7) = id%KEEP(245)
103 IF ( id%INFO(1) .LT. 0 )
RETURN
109 &
'(" ELAPSED time in parallel ordering =",F12.4)')
114 IF ( id%INFO(1) .LT. 0 )
RETURN
115 IF(id%MYID .EQ. 0)
THEN
117 & copy=.false., string=
'',
126 IF(id%KEEP(54) .NE. 3)
THEN
128 id%IRN_loc => saveirn
129 id%JCN_loc => savejcn
134 IF ( id%INFO(1) .LT. 0 )
RETURN
139 IF (myid .EQ. 0)
THEN
141 ne => work1(id%N+1 : 2*id%N)
142 na => work1(2*id%N+1 : 3*id%N)
143 node => work2(1 : id%N )
144 nd => work2(id%N+1 : 2*id%N)
145 subord => work2(2*id%N+1 : 3*id%N)
146 namalg => work2(3*id%N+1 : 4*id%N)
152 & na(1), nfsiz(1), node(1), id%INFOG(6), fils(1), frere(1),
153 & nd(1), nemin, subord(1), id%KEEP(60), id%KEEP(20),
154 & id%KEEP(38), namalg(1), id%KEEP(104), cumul(1),
155 & id%KEEP(50), id%ICNTL(13), id%KEEP(37), id%KEEP(197),
156 & id%NSLAVES, id%KEEP(250).EQ.1, .false., idummy, lidummy)
158 CALL cmumps_ana_m(ne(1), nd(1), id%INFOG(6), id%INFOG(5),
159 & id%KEEP(2), id%KEEP(50), id%KEEP8(101), id%KEEP(108),
160 & id%KEEP(5), id%KEEP(6), id%KEEP(226), id%KEEP(253))
161 IF ( id%KEEP(53) .NE. 0 )
THEN
165 IF ( (id%KEEP(48) == 4 .AND. id%KEEP8(21).GT.0_8)
167 & (id%KEEP (48)==5 .AND. id%KEEP8(21) .GT. 0_8 )
169 & (id%KEEP(24).NE.0.AND.id%KEEP8(21).GT.0_8) )
THEN
171 & id%KEEP(48), id%KEEP(50), id%NSLAVES)
173 IF ((id%KEEP(210).LT.0) .OR. (id%KEEP(210).GT.2))
175 IF ((id%KEEP(210).EQ.0) .AND. (id%KEEP(201).GT.0))
177 IF ((id%KEEP(210).EQ.0) .AND. (id%KEEP(201).EQ.0))
179 IF (id%KEEP(210).EQ.2) id%KEEP8(79)=huge(id%KEEP8(79))
180 IF ((id%KEEP(210).EQ.1) .AND. (id%KEEP8(79).LE.0_8))
THEN
181 id%KEEP8(79)=k79ref * int(id%NSLAVES,8)
183 IF ( (id%KEEP(79).EQ.0).OR.(id%KEEP(79).EQ.2).OR.
184 & (id%KEEP(79).EQ.3).OR.(id%KEEP(79).EQ.5).OR.
187 IF (id%KEEP(210).EQ.1)
THEN
189 IF ( id%KEEP(62).GE.1)
THEN
192 & nfsiz(1), idummy, lidummy, id%INFOG(6),
193 & id%NSLAVES, id%KEEP(1), id%KEEP8(1), splitroot,
194 &
mp, ldiag, id%INFOG(1), id%INFOG(2))
195 IF (id%INFOG(1).LT.0)
RETURN
199 splitroot = (((id%ICNTL(13).GT.0) .AND.
200 & (id%NSLAVES.GT.id%ICNTL(13))) .OR.
201 & (id%ICNTL(13).EQ.-1)) .AND. (id%KEEP(60).EQ.0)
205 & idummy, lidummy, id%INFOG(6),
206 & id%NSLAVES, id%KEEP(1), id%KEEP8(1),
207 & splitroot,
mp, ldiag, id%INFOG(1), id%INFOG(2))
208 IF (id%INFOG(1).LT.0)
RETURN
214 TYPE(cmumps_struc) :: id
217#if defined(parmetis) || defined(parmetis3)
218 INTEGER :: I, COLOR, BASE, WORKERS
221 IF(id%MYID .EQ. 0) id%KEEP(245) = id%ICNTL(29)
223 & mpi_integer, 0, id%COMM, ierr )
224 IF ((id%KEEP(245) .LT. 0) .OR. (id%KEEP(245) .GT. 2))
THEN
227 IF (id%KEEP(245) .EQ. 0)
THEN
229 IF(id%NSLAVES .LT. 2)
THEN
230 IF(
prokg)
WRITE(
mpg,
'("Warning: older versions
231 &of PT-SCOTCH require at least 2 processors.")')
237 ord%COMM_NODES = id%COMM_NODES
238 ord%NPROCS = id%NPROCS
239 ord%NSLAVES = id%NSLAVES
241 ord%IDO = (id%MYID .GE. 1) .OR. (id%KEEP(46) .EQ. 1)
244 &
'("Parallel ordering tool set to PT-SCOTCH.")')
247#if defined(parmetis) || defined(parmetis3)
251 workers =
min(id%NSLAVES,id%N/16)
255 IF (i .GT. workers)
EXIT
259 base = id%NPROCS-id%NSLAVES
260 ord%NPROCS = ord%NSLAVES + base
261 ido = (id%MYID .GE. base) .AND.
262 & (id%MYID .LE. base+ord%NSLAVES-1)
267 color = mpi_undefined
270 & ord%COMM_NODES, ierr )
276 &
'("Parallel ordering tool set to ParMETIS.")')
282 IF(id%MYID .EQ.0 )
THEN
284 &
'("No parallel ordering tools available.")')
286 &
'("Please install PT-SCOTCH or ParMETIS.")')
289 ELSE IF (id%KEEP(245) .EQ. 1)
THEN
291 IF(id%NSLAVES .LT. 2)
THEN
292 IF(
prokg)
WRITE(
mpg,
'("Warning: older versions
293 &of PT-SCOTCH require at least 2 processors.")')
299 ord%COMM_NODES = id%COMM_NODES
300 ord%NPROCS = id%NPROCS
301 ord%NSLAVES = id%NSLAVES
303 ord%IDO = (id%MYID .GE. 1) .OR. (id%KEEP(46) .EQ. 1)
305 &
'(" Using PT-SCOTCH for parallel ordering")')
310 IF(id%MYID .EQ.0 )
WRITE(
lp,
311 &
'(" PT-SCOTCH not available")')
314 ELSE IF (id%KEEP(245) .EQ. 2)
THEN
315#if defined(parmetis) || defined(parmetis3)
319 workers =
min(id%NSLAVES,id%N/16)
323 IF (i .GT. workers)
EXIT
327 base = id%NPROCS-id%NSLAVES
328 ord%NPROCS = ord%NSLAVES + base
329 ido = (id%MYID .GE. base) .AND.
330 & (id%MYID .LE. base+ord%NSLAVES-1)
335 color = mpi_undefined
344 &
'(" Using ParMETIS for parallel ordering")')
349 IF(id%MYID .EQ.0 )
WRITE(
lp,
350 &
'(" ParMETIS not available.")')
357 TYPE(cmumps_struc) :: id
360#if defined(parmetis) || defined(parmetis3)
363 IF (ord%ORDTOOL .EQ. 1)
THEN
365 CALL cmumps_ptscotch_ord(id, ord, work)
369 WRITE(
lp,*)
'PT-SCOTCH not available. Aborting...'
372 ELSE IF (ord%ORDTOOL .EQ. 2)
THEN
373#if defined(parmetis) || defined(parmetis3)
374 CALL cmumps_parmetis_ord(id, ord, work)
379 WRITE(
lp,*)
'ParMETIS not available. Aborting...'
385#
if defined(parmetis) || defined(parmetis3)
386 SUBROUTINE cmumps_parmetis_ord(id, ord, WORK)
388 TYPE(cmumps_struc) :: id
390 INTEGER,
TARGET :: WORK(:)
391 INTEGER :: I, , NPROCS, , BASE, METIS_IDX_SIZE
392 INTEGER,
POINTER :: FIRST(:),
394 INTEGER :: , VERTLOCNBR,
396 INTEGER(8),
POINTER :: VERTLOCTAB(:)
397 INTEGER,
POINTER :: EDGELOCTAB(:), RCVCNTS(:)
398 INTEGER(8) :: EDGELOCNBR
399 INTEGER,
POINTER :: SIZES(:), ORDER(:)
400 nullify(first, last, swork, vertloctab, edgeloctab, rcvcnts,
405 IF(
size(work) .LT. id%N*3)
THEN
407 &
'("Insufficient workspace inside CMUMPS_PARMETIS_ORD")')
412 base = id%NPROCS-id%NSLAVES
418 CALL cmumps_graph_dist(id, ord, first,
419 & last, base, nprocs, work(1: 2*id%N), type=2)
420 vertlocnbr = last(myid+1)-first(myid+1) + 1
424 swork => work(id%N+1:3*id%N)
425 CALL cmumps_build_dist_graph(id, first, last, vertloctab,
427 IF(id%INFO(1).LT.0)
RETURN
428 edgelocnbr = vertloctab(vertlocnbr+1)-1_8
430 order => work(1:id%N)
435 CALL mumps_metis_idxsize(metis_idx_size)
436 IF (metis_idx_size.EQ.32)
THEN
437 IF (id%KEEP(10).EQ.1)
THEN
441 CALL mumps_parmetis_mixedto32(id, base, vertlocnbr, first,
442 & vertloctab, edgeloctab, baseval, options, order,
443 & sizes, ord%COMM_NODES, ierr)
445 ELSE IF (metis_idx_size.EQ.64)
THEN
446 CALL mumps_parmetis_mixedto64
447 & (id, base, vertlocnbr, first,
448 & vertloctab, edgeloctab, baseval, options, order,
449 & sizes, ord%COMM_NODES, ierr)
452 &
"Internal error in PARMETIS wrappers, METIS_IDX_SIZE=",
465 IF ( id%INFO(1) .LT. 0 )
GOTO 20
466 CALL mpi_bcast(sizes(1), 2*ord%NSLAVES, mpi_integer,
467 & base, id%COMM, ierr)
468 ord%CBLKNBR = 2*ord%NSLAVES-1
473 rcvcnts(i) =
max(last(i)-first(i)+1,0)
476 IF(first(1) .LT. 0)
THEN
479 CALL mpi_allgatherv ( order(1), vertlocnbr, mpi_integer,
481 & rcvcnts(1), first(1), mpi_integer, id%COMM, ierr )
483 ord%PERITAB(ord%PERMTAB(i)) = i
488 CALL cmumps_build_treetab(ord%TREETAB, ord%RANGTAB,
489 & sizes, ord%CBLKNBR)
499 CALL cmumps_build_tree(ord)
509 END SUBROUTINE cmumps_parmetis_ord
512 SUBROUTINE cmumps_ptscotch_ord(id, ord, WORK)
515 include
'ptscotchf.h'
516 TYPE(cmumps_struc) :: id
518 INTEGER,
TARGET :: WORK(:)
519 INTEGER :: MYID, NPROCS, IERR
520 INTEGER,
POINTER :: FIRST(:),
522 INTEGER :: BASEVAL, VERTLOCNBR,
523 & base, scotch_int_size
524 INTEGER(8) :: EDGELOCNBR
525 INTEGER(8),
POINTER :: VERTLOCTAB(:)
526 INTEGER,
POINTER :: EDGELOCTAB(:)
527 INTEGER :: PTHREAD_NUMBER, NOMP
528 nullify(first, last, swork, vertloctab, edgeloctab)
529 IF (
size(work) .LT. id%N*3)
THEN
531 &
'("Insufficient workspace inside CMUMPS_PTSCOTCH_ORD")')
537 base = id%NPROCS-id%NSLAVES
544 CALL cmumps_graph_dist(id, ord, first,
545 & last, base, nprocs, work(1: 2*id%N), type=2)
546 vertlocnbr = last(myid+1)-first(myid+1) + 1
550 swork => work(id%N+1:3*id%N)
551 CALL cmumps_build_dist_graph(id, first, last, vertloctab,
553 IF(id%INFO(1).LT.0)
RETURN
554 edgelocnbr = vertloctab(vertlocnbr+1)-1_8
565 CALL mumps_scotch_intsize(scotch_int_size)
568 IF (nomp .GT. 0)
THEN
569 CALL mumps_scotch_get_pthread_number (pthread_number)
570 CALL mumps_scotch_set_pthread_number (nomp)
572 IF(scotch_int_size.EQ.32)
THEN
573 IF (id%KEEP(10).EQ.1)
THEN
577 CALL mumps_ptscotch_mixedto32(id, ord,
579 & vertlocnbr, vertloctab,
580 & edgelocnbr, edgeloctab,
584 CALL mumps_ptscotch_mixedto64(id, ord,
586 & vertlocnbr, vertloctab,
587 & edgelocnbr, edgeloctab,
590 IF (nomp .GT. 0)
THEN
591 CALL mumps_scotch_set_pthread_number (pthread_number)
599 IF ( id%INFO(1) .LT. 0 )
GOTO 11
600 CALL mpi_bcast (ord%CBLKNBR, 1, mpi_integer,
601 & base, id%COMM, ierr)
602 CALL mpi_bcast (ord%PERMTAB(1), id%N, mpi_integer,
603 & base, id%COMM, ierr)
604 CALL mpi_bcast (ord%PERITAB(1), id%N, mpi_integer,
605 & base, id%COMM, ierr)
606 CALL mpi_bcast (ord%RANGTAB(1), id%N+1, mpi_integer,
607 & base, id%COMM, ierr)
608 CALL mpi_bcast (ord%TREETAB(1), id%N, mpi_integer,
609 & base, id%COMM, ierr)
616 CALL cmumps_build_tree(ord)
631 END SUBROUTINE cmumps_ptscotch_ord
634 & ALIST, LIST, PEAKMEM, NNODES, CHECKMEM)
637 INTEGER :: nactive, rproc, anode, peakmem, nnodes
638 INTEGER :: alist(), list(nnodes)
640 TYPE(cmumps_struc) ::
641 LOGICAL,
OPTIONAL :: checkmem
642 INTEGER :: ipeakmem, big, max_nrows, min_nrows
643 INTEGER :: ,
nrl, hostmem, submem
644 INTEGER :: i, nz_row, weight
647 IF(
present(checkmem))
THEN
653 IF(nactive .GE. rproc)
THEN
657 IF(nactive .EQ. 0)
THEN
661 IF(.NOT. icheckmem)
RETURN
663 IF(nactive .GT. 1)
THEN
664 max_nrows = ord%NW(alist(nactive-1))
665 min_nrows = ord%NW(alist(1))
671 weight = ord%NW(list(i))
672 IF(weight .GT. max_nrows) max_nrows = weight
673 IF(weight .LT. min_nrows) min_nrows = weight
678 IF(weight .GT. max_nrows) max_nrows = weight
679 IF(weight .LT. min_nrows) min_nrows = weight
680 IF(ord%BROTHER(i) .EQ. -1)
EXIT
683 toprows = ord%TOPNODES(2)+ord%RANGTAB(big+1)-ord%RANGTAB(big)
686 nz4=int(
id%KEEP8(28))
687 nz_row = 2*(nz4/
id%N)
688 IF(
id%KEEP(46) .EQ. 0)
THEN
693 hostmem = hostmem + 2*
toprows*nz_row
694 hostmem = hostmem +
nrl
700 submem = submem +
nrl*(nz_row+2)
701 submem = submem + 6*
nrl
702 ipeakmem =
max(hostmem, submem)
703 IF((ipeakmem .GT. peakmem) .AND.
704 & (peakmem .NE. 0))
THEN
720 IF(ord%SON(node) .EQ. -1)
THEN
726 IF(ord%BROTHER(curr) .NE. -1)
THEN
728 curr = ord%BROTHER(curr)
739 TYPE(cmumps_struc) :: id
740 INTEGER,
ALLOCATABLE :: (:), AWEIGHTS(:), LIST(:), WORK(:)
741 INTEGER :: NNODES, BIG, CURR, ND, NACTIVE, RPROC, ANODE, BASE, I,
742 & nk, peakmem, allocok
752 ALLOCATE(alist(nnodes), aweights(nnodes), list(nnodes),
753 & work(0:nnodes+1), stat=allocok)
754 IF(allocok.GT.0)
THEN
756 id%INFO(2)=4*nnodes+2
759 IF ( id%INFO(1) .LT. 0 )
GO TO 90
762 IF (ord%TREETAB(i).EQ.-1)
THEN
764 IF(nactive.LE.nnodes)
THEN
766 aweights(nactive) = ord%NW(i)
770 IF((ord%CBLKNBR .EQ. 1) .OR.
771 & (nactive.GT.nnodes) .OR.
774 ord%TOPNODES(2) = ord%RANGTAB(ord%CBLKNBR+1) - ord%RANGTAB(1)
775 ord%TOPNODES(3) = ord%RANGTAB(1)
776 ord%TOPNODES(4) = ord%RANGTAB(ord%CBLKNBR+1)
784 & aweights(1:nactive),
791 IF(nactive .EQ. 0)
EXIT
794 IF((nk .GT. (rproc-nactive+1)) .OR. (nk .EQ. 0))
THEN
802 & rproc, alist, list, peakmem, nnodes, checkmem=.true.)
805 IF(nactive.GT.0)
THEN
806 list(anode+1:anode+nactive) = alist(1:nactive)
807 anode = anode+nactive
811 ord%TOPNODES(1) = ord%TOPNODES(1)+1
812 ord%TOPNODES(2) = ord%TOPNODES(2) +
813 & ord%RANGTAB(big+1) - ord%RANGTAB(big)
814 ord%TOPNODES(2+2*(ord%TOPNODES(1)-1)+1) = ord%RANGTAB(big)
815 ord%TOPNODES(2+2*(ord%TOPNODES(1)-1)+2) =
816 & ord%RANGTAB(big+1)-1
818 alist(nactive) = curr
819 aweights(nactive) = ord%NW(curr)
821 IF(ord%BROTHER(curr) .EQ. -1)
EXIT
823 curr = ord%BROTHER(curr)
824 alist(nactive) = curr
825 aweights(nactive) = ord%NW(curr)
830 & aweights(1:nactive),
834 aweights(i) = ord%NW(list(i))
839 IF (id%KEEP(46) .EQ. 1)
THEN
849 IF(ord%SON(nd) .NE. -1)
THEN
852 IF((ord%SON(nd) .EQ. -1) .AND.
853 & (ord%BROTHER(nd).EQ.-1))
THEN
855 ELSE IF(ord%BROTHER(nd) .EQ. -1)
THEN
862 ord%FIRST(base+i) = ord%RANGTAB(nd)
863 ord%LAST(base+i) = ord%RANGTAB(curr+1)-1
865 DO i=anode+1, id%NSLAVES
866 ord%FIRST(base+i) = id%N+1
867 ord%LAST(base+i) = id%N
869 DEALLOCATE(list, alist, aweights, work)
875 TYPE(cmumps_struc) :: id
877 INTEGER,
POINTER :: GPE(:), GNV(:)
878 INTEGER,
TARGET :: WORK(:)
880 INTEGER(8),
POINTER :: IPE(:), IPET(:),
881 & buf_pe1(:), buf_pe2(:), tmp1(:)
882 INTEGER,
POINTER :: (:),
883 & LENG(:), I_HALO_MAP(:)
884 INTEGER,
POINTER :: NDENSE(:), LAST(:),
885 & DEGREE(:), W(:), PERM(:),
886 & listvar_schur(:), next(:),
887 & head(:), nv(:), elen(:),
889 INTEGER,
POINTER :: MYLIST(:),
892 & nvt(:), buf_nv1(:),
893 & buf_nv2(:), rootperm(:),
894 & tmp2(:), bwork(:), ncliques(:)
895 INTEGER :: MYNCLIQUES, MYMAXVARS, ICLIQUES,
897 INTEGER(8) :: MYNVARS, TOTNVARS
898 INTEGER(8),
POINTER :: LVARPT(:)
899 INTEGER :: HIDX, NCMPA, I, J, SIZE_SCHUR, MYID,
900 & nprocs, ierr, nrows_loc, glob_idx, tmp,
901 & ntvar, tgsize, maxs, rhandpe,
902 & rhandnv, ridx, proc, job, k
903 INTEGER(8) :: PFREES, PFS_SAVE, PELEN, PFREET, PFT_SAVE
904 INTEGER :: STATUSPE(MPI_STATUS_SIZE)
905 INTEGER :: STATUSNV(MPI_STATUS_SIZE)
906 INTEGER :: STATUSCLIQUES(MPI_STATUS_SIZE)
907 INTEGER,
PARAMETER :: ITAG=30
910 nullify(pe, ipe, leng, i_halo_map, ncliques)
911 nullify(ndense, last, degree, w, perm, listvar_schur,
912 & next, head, nv, elen, lstvar)
913 nullify(mylist, lvarpt,
914 & lperm, liperm, ipet, nvt, buf_pe1, buf_pe2,
915 & buf_nv1, buf_nv2, rootperm, tmp1, tmp2, bwork)
918 IF(
size(work) .LT. 4*id%N)
THEN
919 WRITE(
lp,*)
'Insufficient workspace in CMUMPS_PARSYMFACT'
922 head => work( 1 : id%N)
923 elen => work( id%N+1 : 2*id%N)
924 leng => work(2*id%N+1 : 3*id%N)
925 perm => work(3*id%N+1 : 4*id%N)
930 nrows_loc = ord%LAST(myid+1)-ord%FIRST(myid+1)+1
933 bwork => work(1 : 2*id%N)
935 & i_halo_map, top_graph, bwork)
938 IF(id%INFO(1).lt.0)
RETURN
941 tmp = tmp-(ord%LAST(i)-ord%FIRST(i)+1)
943 tmp = ceiling(real(tmp)*1.10e0)
945 tmp =
max(
max(tmp, hidx),1)
949 size_schur = hidx - nrows_loc
966 listvar_schur(i) = nrows_loc+i
970 pfrees = ipe(nrows_loc+1)
972 pelen = pfrees-1 + 2_8*int(nrows_loc+ord%TOPNODES(2),8)
976 IF(size_schur.EQ.0)
THEN
982 & hidx, pelen, ipe(1), pfrees, leng(1), pe(1), nv(1),
983 & elen(1), last(1), ncmpa, degree(1), head(1), next(1),
984 & w(1), perm(1), listvar_schur(1), size_schur, agg6)
989 IF(ipe(i) .GT. 0)
THEN
990 mymaxvars =
max(mymaxvars,leng(i))
991 mynvars = mynvars+leng(i)
992 myncliques = myncliques+1
995 CALL mpi_reduce(mynvars, totnvars, 1, mpi_integer8,
996 & mpi_sum, 0, id%COMM, ierr)
999 CALL mpi_gather(myncliques, 1, mpi_integer, ncliques(1), 1,
1000 & mpi_integer, 0, id%COMM, ierr)
1001 IF(id%MYID.EQ.0)
THEN
1002 totncliques = sum(ncliques)
1010 IF(ipe(i) .GT. 0)
THEN
1011 icliques = icliques+1
1012 lvarpt(icliques+1) = lvarpt(icliques)+leng(i)
1014 lstvar(lvarpt(icliques)+j) =
1015 & i_halo_map(pe(ipe(i)+j)-nrows_loc)
1020 DO i=1, ncliques(proc+1)
1021 icliques = icliques+1
1022 CALL mpi_recv(k, 1, mpi_integer, proc, itag, id%COMM,
1023 & statuscliques, ierr)
1024 lvarpt(icliques+1) = lvarpt(icliques)+k
1025 CALL mpi_recv(lstvar(lvarpt(icliques)), k, mpi_integer,
1026 & proc, itag, id%COMM, statuscliques, ierr)
1029 lperm => work(3*id%N+1 : 4*id%N)
1030 ntvar = ord%TOPNODES(2)
1033 & top_graph, totncliques, lstvar, lvarpt, ipet, pe,
1035 tgsize = ord%TOPNODES(2)+totncliques
1036 pfreet = ipet(tgsize+1)
1044 IF(ipe(i) .GT. 0)
THEN
1046 mylist(j) = i_halo_map(pe(ipe(i)+j-1)-nrows_loc)
1048 CALL mpi_send(leng(i), 1, mpi_integer
1050 CALL mpi_send(mylist(1), leng(i), mpi_integer, 0, itag,
1057 IF(myid .EQ. 0)
THEN
1077 listvar_schur(i) = ntvar+i
1089 pelen =
max(pfreet+int(tgsize,8),1_8)
1091 & tgsize, pelen, ipet(1), pfreet, leng(1), pe(1),
1092 & nvt(1), elen(1), last(1), ncmpa, degree(1), head(1),
1093 & next(1), w(1), perm(1), listvar_schur(1), totncliques,
1100 IF(myid .EQ. 0)
THEN
1103 IF((ord%LAST(i)-ord%FIRST(i)+1) .GT. maxs)
1104 & maxs = (ord%LAST(i)-ord%FIRST(i)+1)
1115 &
lp, string='gpe
', MEMCNT=MEMCNT, ERRCODE=-7)
1116 CALL MUMPS_REALLOC(GNV, id%N, id%INFO,
1117 & LP, STRING='gnv
', MEMCNT=MEMCNT, ERRCODE=-7)
1118 CALL MUMPS_REALLOC(ROOTPERM, TOTNCLIQUES, id%INFO,
1119 & LP, STRING='rootperm
', MEMCNT=MEMCNT, ERRCODE=-7)
1120.GT.
IF(MEMCNT MAXMEM) MAXMEM=MEMCNT
1124 NULLIFY(BUF_PE1, BUF_NV1)
1128 CALL MPI_IRECV(BUF_PE2(1), ord%LAST(PROC+2)-
1129 & ord%FIRST(PROC+2)+1, MPI_INTEGER8, PROC+1, PROC+1,
1130 & id%COMM, RHANDPE, IERR)
1131 CALL MPI_IRECV(BUF_NV2(1), ord%LAST(PROC+2)-
1132 & ord%FIRST(PROC+2)+1, MPI_INTEGER, PROC+1, PROC+1,
1133 & id%COMM, RHANDNV, IERR)
1134 DO I=1, ord%LAST(PROC+1)-ord%FIRST(PROC+1)+1
1135 GLOB_IDX = ord%PERITAB(I+ord%FIRST(PROC+1)-1)
1136.GT.
IF(BUF_PE1(I) 0) THEN
1138 ROOTPERM(RIDX) = GLOB_IDX
1139 GNV(GLOB_IDX) = BUF_NV1(I)
1140.EQ.
ELSE IF (BUF_PE1(I) 0) THEN
1142 GNV(GLOB_IDX) = BUF_NV1(I)
1144 GPE(GLOB_IDX) = -ord%PERITAB(-BUF_PE1(I)+
1145 & ord%FIRST(PROC+1)-1)
1146 GNV(GLOB_IDX) = BUF_NV1(I)
1149 CALL MPI_WAIT(RHANDPE, STATUSPE, IERR)
1150 CALL MPI_WAIT(RHANDNV, STATUSNV, IERR)
1157 NULLIFY(BUF_PE2, BUF_NV2)
1162 DO I=1, ord%LAST(PROC+1)-ord%FIRST(PROC+1)+1
1163 GLOB_IDX = ord%PERITAB(I+ord%FIRST(PROC+1)-1)
1164.GT.
IF(BUF_PE1(I) 0) THEN
1166 ROOTPERM(RIDX) = GLOB_IDX
1167 GNV(GLOB_IDX) = BUF_NV1(I)
1168.EQ.
ELSE IF (BUF_PE1(I) 0) THEN
1170 GNV(GLOB_IDX) = BUF_NV1(I)
1172 GPE(GLOB_IDX) = -ord%PERITAB(-BUF_PE1(I)+
1173 & ord%FIRST(PROC+1)-1)
1174 GNV(GLOB_IDX) = BUF_NV1(I)
1178 GLOB_IDX = LIPERM(I)
1179.EQ.
IF(IPET(I) 0) THEN
1181 GNV(GLOB_IDX) = NVT(I)
1183 GPE(GLOB_IDX) = -LIPERM(-IPET(I))
1184 GNV(GLOB_IDX) = NVT(I)
1188 GLOB_IDX = ROOTPERM(I)
1189 GPE(GLOB_IDX) = -LIPERM(-IPET(NTVAR+I))
1192 CALL MPI_SEND(IPE(1), ord%LAST(MYID+1)-ord%FIRST(MYID+1)+1,
1193 & MPI_INTEGER8, 0, MYID, id%COMM, IERR)
1194 CALL MPI_SEND(NV(1), ord%LAST(MYID+1)-ord%FIRST(MYID+1)+1,
1195 & MPI_INTEGER, 0, MYID, id%COMM, IERR)
1197 CALL MUMPS_DEALLOC(BUF_NV1, BUF_NV2, MEMCNT=MEMCNT)
1198 CALL MUMPS_I8DEALLOC(BUF_PE1, BUF_PE2, IPE, IPET,
1199 & TMP1, LVARPT, MEMCNT=MEMCNT)
1200 CALL MUMPS_DEALLOC(PE, I_HALO_MAP, NDENSE,
1201 & LAST, DEGREE, MEMCNT=MEMCNT)
1202 CALL MUMPS_DEALLOC(W, LISTVAR_SCHUR, NEXT,
1203 & NV, MEMCNT=MEMCNT)
1204 CALL MUMPS_DEALLOC(LSTVAR, NCLIQUES, MYLIST,
1206 CALL MUMPS_DEALLOC(LPERM, LIPERM, NVT, MEMCNT=MEMCNT)
1207 CALL MUMPS_DEALLOC(ROOTPERM, TMP2, MEMCNT=MEMCNT)
1208 NULLIFY(HEAD, ELEN, LENG, PERM)
1210 END SUBROUTINE CMUMPS_PARSYMFACT
1211 SUBROUTINE CMUMPS_MAKE_LOC_IDX(id, TOPNODES, LPERM, LIPERM, ord)
1213 TYPE(CMUMPS_STRUC) :: id
1214 INTEGER, POINTER :: TOPNODES(:), LPERM(:), LIPERM(:)
1215 TYPE(ORD_TYPE) :: ord
1216 INTEGER :: I, J, K, GIDX
1217 CALL MUMPS_REALLOC(LPERM , ord%N, id%INFO,
1218 & LP, STRING='lidx:lperm
', MEMCNT=MEMCNT, ERRCODE=-7)
1219 CALL MUMPS_REALLOC(LIPERM, TOPNODES(2), id%INFO,
1220 & LP, STRING='lidx:liperm
', MEMCNT=MEMCNT, ERRCODE=-7)
1221.GT.
IF(MEMCNT MAXMEM) MAXMEM=MEMCNT
1224 DO I=TOPNODES(1), 1, -1
1225 DO J=TOPNODES(2*I+1), TOPNODES(2*I+2)
1226 GIDX = ord%PERITAB(J)
1233 END SUBROUTINE CMUMPS_MAKE_LOC_IDX
1234 SUBROUTINE CMUMPS_ASSEMBLE_TOP_GRAPH(id, NLOCVARS, LPERM,
1235 & top_graph, NCLIQUES, LSTVAR, LVARPT, IPE, PE, LENG, ELEN)
1237 TYPE(CMUMPS_STRUC) :: id
1238 TYPE(GRAPH_TYPE) :: top_graph
1239 INTEGER, POINTER :: LPERM(:), LSTVAR(:),
1240 & PE(:), LENG(:), ELEN(:)
1241 INTEGER(8) :: LVARPT(:)
1243 INTEGER(8), POINTER :: IPE(:)
1244 INTEGER :: I, IDX, NLOCVARS
1245 INTEGER(8) :: INNZ, PNT, SAVEPNT
1246 CALL MUMPS_REALLOC(LENG, max(NLOCVARS+NCLIQUES,1) , id%INFO,
1247 & LP, STRING='atg:leng
', MEMCNT=MEMCNT, ERRCODE=-7)
1248 CALL MUMPS_REALLOC(ELEN, max(NLOCVARS+NCLIQUES,1) , id%INFO,
1249 & LP, STRING='atg:elen
', MEMCNT=MEMCNT, ERRCODE=-7)
1250 CALL MUMPS_I8REALLOC(IPE , NLOCVARS+NCLIQUES+1, id%INFO,
1251 & LP, STRING='atg:ipe
', MEMCNT=MEMCNT, ERRCODE=-7)
1252.GT.
IF(MEMCNT MAXMEM) MAXMEM=MEMCNT
1255 DO INNZ=1, top_graph%NZ_LOC
1256.NE..AND.
IF((LPERM(top_graph%JCN_LOC(INNZ)) 0)
1257.NE.
& (top_graph%JCN_LOC(INNZ) top_graph%IRN_LOC(INNZ)))
1259 LENG(LPERM(top_graph%IRN_LOC(INNZ))) =
1260 & LENG(LPERM(top_graph%IRN_LOC(INNZ))) + 1
1264 DO INNZ=LVARPT(I), LVARPT(I+1)-1
1265 ELEN(LPERM(LSTVAR(INNZ))) = ELEN(LPERM(LSTVAR(INNZ)))+1
1266 LENG(NLOCVARS+I) = LENG(NLOCVARS+I)+1
1270 DO I=1, NLOCVARS+NCLIQUES
1271 IPE(I+1) = IPE(I)+int(LENG(I),8)+int(ELEN(I),8)
1273 CALL MUMPS_IREALLOC8(PE, IPE(NLOCVARS+NCLIQUES+1)+
1274 & int(NLOCVARS,8)+int(NCLIQUES,8),
1275 & id%INFO, LP, STRING='atg:pe
', MEMCNT=MEMCNT, ERRCODE=-7)
1276.GT.
IF(MEMCNT MAXMEM) MAXMEM=MEMCNT
1280 DO INNZ=LVARPT(I), LVARPT(I+1)-1
1281 IDX = LPERM(LSTVAR(INNZ))
1282 PE(IPE(IDX)+int(ELEN(IDX),8)) = NLOCVARS+I
1283 PE(IPE(NLOCVARS+I)+int(LENG(NLOCVARS+I),8)) = IDX
1284 ELEN(LPERM(LSTVAR(INNZ))) = ELEN(LPERM(LSTVAR(INNZ)))+1
1285 LENG(NLOCVARS+I) = LENG(NLOCVARS+I)+1
1288 DO INNZ=1, top_graph%NZ_LOC
1289.NE..AND.
IF((LPERM(top_graph%JCN_LOC(INNZ)) 0)
1290.NE.
& (top_graph%JCN_LOC(INNZ) top_graph%IRN_LOC(INNZ)))
1292 PE(IPE(LPERM(top_graph%IRN_LOC(INNZ)))+
1293 & ELEN(LPERM(top_graph%IRN_LOC(INNZ))) +
1294 & LENG(LPERM(top_graph%IRN_LOC(INNZ)))) =
1295 & LPERM(top_graph%JCN_LOC(INNZ))
1296 LENG(LPERM(top_graph%IRN_LOC(INNZ))) =
1297 & LENG(LPERM(top_graph%IRN_LOC(INNZ))) + 1
1300 DO I=1, NLOCVARS+NCLIQUES
1301 LENG(I) = LENG(I)+ELEN(I)
1305 LPERM(1:NLOCVARS+NCLIQUES) = 0
1306 DO I=1, NLOCVARS+NCLIQUES
1307 DO INNZ=IPE(I), IPE(I+1)-1
1308.EQ.
IF(LPERM(PE(INNZ)) I) THEN
1319 IPE(NLOCVARS+NCLIQUES+1) = SAVEPNT
1321 END SUBROUTINE CMUMPS_ASSEMBLE_TOP_GRAPH
1322#if defined(parmetis) || defined(parmetis3)
1323 SUBROUTINE CMUMPS_BUILD_TREETAB(TREETAB, RANGTAB, SIZES, CBLKNBR)
1324 INTEGER, POINTER :: TREETAB(:), RANGTAB(:), SIZES(:)
1325 INTEGER :: CBLKNBR,allocok
1326 INTEGER :: LCHILD, RCHILD, K, I
1327 INTEGER, POINTER :: PERM(:)
1328 ALLOCATE(PERM(CBLKNBR),stat=allocok)
1329.GT.
if(allocok0) then
1330 write(*,*) "Allocation error of PERM in CMUMPS_BUILD_TREETAB"
1333 TREETAB(CBLKNBR) = -1
1334.EQ.
IF(CBLKNBR 1) THEN
1338 RANGTAB(2)= SIZES(1)+1
1341 LCHILD = CBLKNBR - (CBLKNBR+1)/2
1344 PERM(CBLKNBR) = CBLKNBR
1345 PERM(LCHILD) = CBLKNBR+1 - (2*K+1)
1346 PERM(RCHILD) = CBLKNBR+1 - (2*K)
1347 TREETAB(RCHILD) = CBLKNBR
1348 TREETAB(LCHILD) = CBLKNBR
1349.GT.
IF(CBLKNBR 3) THEN
1350 CALL REC_TREETAB(TREETAB, PERM, (CBLKNBR-1)/2,
1351 & LCHILD, CBLKNBR, 2*K+1)
1352 CALL REC_TREETAB(TREETAB, PERM, (CBLKNBR-1)/2,
1353 & RCHILD, CBLKNBR, 2*K)
1357 RANGTAB(I+1) = RANGTAB(I)+SIZES(PERM(I))
1362 RECURSIVE SUBROUTINE REC_TREETAB(TREETAB, PERM, SUBNODES,
1363 & ROOTN, CBLKNBR, K)
1364 INTEGER, POINTER :: TREETAB(:), PERM(:)
1365 INTEGER :: SUBNODES, ROOTN, K, CBLKNBR
1366 INTEGER :: LCHILD, RCHILD
1367 LCHILD = ROOTN - (SUBNODES+1)/2
1369 PERM(LCHILD) = CBLKNBR+1 - (2*K+1)
1370 PERM(RCHILD) = CBLKNBR+1 - (2*K)
1371 TREETAB(RCHILD) = ROOTN
1372 TREETAB(LCHILD) = ROOTN
1373.GT.
IF(SUBNODES 3) THEN
1374 CALL REC_TREETAB(TREETAB, PERM, (SUBNODES-1)/2, LCHILD,
1376 CALL REC_TREETAB(TREETAB, PERM, (SUBNODES-1)/2, RCHILD,
1379 END SUBROUTINE REC_TREETAB
1380 END SUBROUTINE CMUMPS_BUILD_TREETAB
1382#if defined(ptscotch) || defined(parmetis) || defined(parmetis3)
1383 SUBROUTINE CMUMPS_BUILD_DIST_GRAPH(id, FIRST, LAST, IPE,
1386 TYPE(CMUMPS_STRUC) :: id
1387 INTEGER(8), POINTER :: IPE(:)
1388 INTEGER, POINTER :: FIRST(:), LAST(:), PE(:),
1390 INTEGER :: IERR, MYID, NPROCS
1391 INTEGER :: I, PROC, J, LOC_ROW
1392 INTEGER(8) :: LOCNNZ, INNZ, NEW_LOCNNZ, OFFDIAG,
1393 & RCVPNT, PNT, SAVEPNT, DUPS, TOTDUPS
1394 INTEGER :: NROWS_LOC
1395 INTEGER :: STATUS(MPI_STATUS_SIZE)
1396 INTEGER, POINTER :: MAPTAB(:)
1397 INTEGER(8), POINTER :: MSGCNT(:), SNDCNT(:), RCVCNT(:)
1398 INTEGER, POINTER :: RDISPL(:), BUFLEVEL(:),
1399 & SIPES(:,:), LENG(:)
1400 INTEGER, POINTER :: TSENDI(:),
1401 & TSENDJ(:), RCVBUF(:)
1402 TYPE(ARRPNT), POINTER :: APNT(:)
1403 INTEGER :: BUFSIZE, SOURCE, MAXS, allocok
1404 INTEGER, PARAMETER :: ITAG=30
1406 DOUBLE PRECISION :: SYMMETRY
1407 INTEGER(KIND=8) :: TLEN
1408#if defined(DETERMINISTIC_PARALLEL_GRAPH)
1411 nullify(MAPTAB, SNDCNT, RCVCNT)
1412 nullify(RDISPL, MSGCNT, SIPES, LENG, BUFLEVEL)
1413 nullify(TSENDI, TSENDJ, RCVBUF, APNT)
1414 CALL MPI_COMM_RANK (id%COMM, MYID, IERR)
1415 CALL MPI_COMM_SIZE (id%COMM, NPROCS, IERR)
1416.LT.
IF(MUMPS_GETSIZE(WORK) id%N*2) THEN
1418 & '(
"Insufficient workspace inside BUILD_SCOTCH_GRAPH")
')
1421 CALL MUMPS_I8REALLOC(SNDCNT, NPROCS, id%INFO, LP,
1422 & MEMCNT=MEMCNT, ERRCODE=-7)
1423 CALL MUMPS_I8REALLOC(RCVCNT, NPROCS, id%INFO, LP,
1424 & MEMCNT=MEMCNT, ERRCODE=-7)
1425 CALL MUMPS_I8REALLOC(MSGCNT, NPROCS, id%INFO, LP,
1426 & MEMCNT=MEMCNT, ERRCODE=-7)
1427 CALL MUMPS_REALLOC(RDISPL, NPROCS, id%INFO, LP,
1428 & MEMCNT=MEMCNT, ERRCODE=-7)
1429.GT.
IF(MEMCNT MAXMEM) MAXMEM=MEMCNT
1430 ALLOCATE(APNT(NPROCS), stat=allocok)
1431.GT.
IF(allocok0) THEN
1435 CALL MUMPS_PROPINFO( id%ICNTL(1), id%INFO(1), id%COMM, id%MYID )
1436.LT.
IF ( id%INFO(1) 0 ) GO TO 90
1439 BUFSIZE = id%KEEP(39)
1440 LOCNNZ = id%KEEP8(29)
1441 NROWS_LOC = LAST(MYID+1)-FIRST(MYID+1)+1
1442 MAPTAB => WORK( 1 : id%N)
1443 LENG => WORK(id%N+1 : 2*id%N)
1446.GT.
IF((LAST(I)-FIRST(I)+1) MAXS) THEN
1447 MAXS = LAST(I)-FIRST(I)+1
1449 DO J=FIRST(I), LAST(I)
1453 ALLOCATE(SIPES(max(1,MAXS), NPROCS), stat=allocok)
1454.GT.
IF(allocok0) THEN
1456 id%INFO(2)=max(1,MAXS)*NPROCS
1458 CALL MUMPS_PROPINFO( id%ICNTL(1), id%INFO(1), id%COMM, id%MYID )
1459.LT.
IF ( id%INFO(1) 0 ) GO TO 90
1463.NE.
IF(id%IRN_loc(INNZ) id%JCN_loc(INNZ)) THEN
1465 PROC = MAPTAB(id%IRN_loc(INNZ))
1466 LOC_ROW = id%IRN_loc(INNZ)-FIRST(PROC)+1
1467 SIPES(LOC_ROW, PROC) = SIPES(LOC_ROW, PROC)+1
1468 SNDCNT(PROC) = SNDCNT(PROC)+1
1469 PROC = MAPTAB(id%JCN_loc(INNZ))
1470 LOC_ROW = id%JCN_loc(INNZ)-FIRST(PROC)+1
1471 SIPES(LOC_ROW, PROC) = SIPES(LOC_ROW, PROC)+1
1472 SNDCNT(PROC) = SNDCNT(PROC)+1
1475 CALL MPI_ALLREDUCE (OFFDIAG, id%KEEP8(127), 1, MPI_INTEGER8,
1476 & MPI_SUM, id%COMM, IERR)
1477 id%KEEP8(127) = id%KEEP8(127)+3*id%N
1478 id%KEEP8(126) = id%KEEP8(127)-2*id%N
1479 CALL MPI_ALLTOALL(SNDCNT(1), 1, MPI_INTEGER8, RCVCNT(1), 1,
1480 & MPI_INTEGER8, id%COMM, IERR)
1481 CALL MUMPS_I8DEALLOC(SNDCNT, MEMCNT=MEMCNT)
1483 CALL MPI_REDUCE_SCATTER ( SIPES(1,1), LENG(1), RDISPL(1),
1484 & MPI_INTEGER, MPI_SUM, id%COMM, IERR )
1489 IPE(I+1) = IPE(I) + int(LENG(I),8)
1490 TLEN = TLEN+int(LENG(I),8)
1492 CALL MUMPS_IREALLOC8(PE, max(IPE(NROWS_LOC+1)-1_8,1_8), id%INFO,
1493 & LP, STRING='pe
', MEMCNT=MEMCNT, ERRCODE=-7)
1494.GT.
IF(MEMCNT MAXMEM) MAXMEM=MEMCNT
1496 CALL MUMPS_REALLOC(BUFLEVEL, NPROCS, id%INFO, LP,
1497 & MEMCNT=MEMCNT, ERRCODE=-7)
1498 CALL CMUMPS_SEND_BUF(APNT, PROC, NPROCS, BUFSIZE, IPE, PE, LENG,
1499 & RCVBUF, MSGCNT, BUFLEVEL, id%COMM)
1502 NEW_LOCNNZ = NEW_LOCNNZ+RCVCNT(I)
1503 MSGCNT(I) = RCVCNT(I)/int(BUFSIZE,8)
1508.EQ.
IF(mod(INNZ,int(BUFSIZE,8)/10_8) 0) THEN
1509 CALL MPI_IPROBE( MPI_ANY_SOURCE, ITAG, id%COMM,
1510 & FLAG, STATUS, IERR )
1512 SOURCE = STATUS(MPI_SOURCE)
1513 CALL MPI_RECV(RCVBUF(1), 2*BUFSIZE, MPI_INTEGER, SOURCE,
1514 & ITAG, id%COMM, STATUS, IERR)
1515 CALL CMUMPS_ASSEMBLE_MSG(BUFSIZE, RCVBUF, IPE, PE, LENG)
1516 MSGCNT(SOURCE+1)=MSGCNT(SOURCE+1)-1
1517 RCVPNT = RCVPNT + BUFSIZE
1520.NE.
IF(id%IRN_loc(INNZ) id%JCN_loc(INNZ)) THEN
1521 PROC = MAPTAB(id%IRN_loc(INNZ))
1522 APNT(PROC)%BUF(2*BUFLEVEL(PROC)+1) = id%IRN_loc(INNZ)-
1524 APNT(PROC)%BUF(2*BUFLEVEL(PROC)+2) = id%JCN_loc(INNZ)
1525 BUFLEVEL(PROC) = BUFLEVEL(PROC)+1
1526.EQ.
IF(BUFLEVEL(PROC) BUFSIZE) THEN
1527 CALL CMUMPS_SEND_BUF(APNT, PROC, NPROCS, BUFSIZE, IPE,
1528 & PE, LENG, RCVBUF, MSGCNT, BUFLEVEL, id%COMM)
1530 PROC = MAPTAB(id%JCN_loc(INNZ))
1531 APNT(PROC)%BUF(2*BUFLEVEL(PROC)+1) = id%JCN_loc(INNZ)-
1533 APNT(PROC)%BUF(2*BUFLEVEL(PROC)+2) = id%IRN_loc(INNZ)
1534 BUFLEVEL(PROC) = BUFLEVEL(PROC)+1
1535.EQ.
IF(BUFLEVEL(PROC) BUFSIZE) THEN
1536 CALL CMUMPS_SEND_BUF(APNT, PROC, NPROCS, BUFSIZE, IPE,
1537 & PE, LENG, RCVBUF, MSGCNT, BUFLEVEL, id%COMM)
1541 CALL CMUMPS_SEND_BUF(APNT, -1, NPROCS, BUFSIZE, IPE, PE, LENG,
1542 & RCVBUF, MSGCNT, BUFLEVEL, id%COMM)
1548 DO INNZ=IPE(I),IPE(I+1)-1
1549.EQ.
IF(MAPTAB(PE(INNZ)) I) THEN
1552 MAPTAB(PE(INNZ)) = I
1560 CALL MPI_REDUCE( DUPS, TOTDUPS, 1, MPI_INTEGER8, MPI_SUM,
1561 & 0, id%COMM, IERR )
1563 SYMMETRY = dble(TOTDUPS)/(dble(id%KEEP8(28))-dble(id%N))
1564 SYMMETRY = min(SYMMETRY,1.0d0)
1565.GE.
IF(id%KEEP(50) 1) SYMMETRY = 1.d0
1566 IF(PROKG) WRITE(MPG,'(
" Structural symmetry is:",i3,
"%")
')
1567 & ceiling(SYMMETRY*100.d0)
1568 id%INFOG(8) = ceiling(SYMMETRY*100.0d0)
1570 IPE(NROWS_LOC+1) = SAVEPNT
1571 CALL MUMPS_DEALLOC(BUFLEVEL, RDISPL, MEMCNT=MEMCNT)
1572 CALL MUMPS_I8DEALLOC(MSGCNT, SNDCNT, RCVCNT, MEMCNT=MEMCNT)
1574#if defined(DETERMINISTIC_PARALLEL_GRAPH)
1575 DO I=1, LAST(MYID+1)-FIRST(MYID+1)+1
1576 L = int(IPE(I+1)-IPE(I))
1577 CALL CMUMPS_MERGESORT(L,
1578 & PE(IPE(I):IPE(I+1)-1),
1580 CALL CMUMPS_MERGESWAP1(L, WORK(:),
1581 & PE(IPE(I):IPE(I+1)-1))
1586 END SUBROUTINE CMUMPS_BUILD_DIST_GRAPH
1588 SUBROUTINE CMUMPS_BUILD_LOC_GRAPH(id, ord, GSIZE, IPE, PE, LENG,
1589 & I_HALO_MAP, top_graph, WORK)
1591 TYPE(CMUMPS_STRUC) :: id
1592 TYPE(ORD_TYPE) :: ord
1593 TYPE(GRAPH_TYPE) :: top_graph
1594 INTEGER(8), POINTER :: IPE(:)
1595 INTEGER, POINTER :: PE(:), LENG(:),
1596 & I_HALO_MAP(:), WORK(:)
1598 INTEGER :: IERR, MYID, NPROCS
1599 INTEGER :: I, PROC, J, LOC_ROW
1600 INTEGER(8) :: LOCNNZ, INNZ, NEW_LOCNNZ, TOP_CNT, TIDX,
1602 INTEGER :: IIDX,JJDX
1603 INTEGER :: HALO_SIZE, NROWS_LOC, DUPS
1604 INTEGER :: STATUS(MPI_STATUS_SIZE)
1605 INTEGER(8), POINTER :: MSGCNT(:), SNDCNT(:), RCVCNT(:)
1606 INTEGER, POINTER :: MAPTAB(:),
1607 & HALO_MAP(:), BUFLEVEL(:)
1608 INTEGER, POINTER :: RDISPL(:),
1610 INTEGER, POINTER :: TSENDI(:),
1611 & TSENDJ(:), RCVBUF(:)
1612 TYPE(ARRPNT), POINTER :: APNT(:)
1613 INTEGER :: BUFSIZE, SOURCE, MAXS, allocok
1614 INTEGER(8) :: PNT, SAVEPNT
1615 INTEGER, PARAMETER :: ITAG=30
1616 INTEGER(KIND=8) :: TLEN
1618 nullify(MAPTAB, SNDCNT, RCVCNT, HALO_MAP)
1619 nullify(RDISPL, MSGCNT, SIPES, BUFLEVEL)
1620 nullify(TSENDI, TSENDJ, RCVBUF, APNT)
1621 CALL MPI_COMM_RANK (id%COMM, MYID, IERR)
1622 CALL MPI_COMM_SIZE (id%COMM, NPROCS, IERR)
1623.LT.
IF(MUMPS_GETSIZE(WORK) id%N*2) THEN
1625 & '(
"Insufficient workspace inside BUILD_LOC_GRAPH")
')
1628 MAPTAB => WORK( 1 : id%N)
1629 HALO_MAP => WORK(id%N+1 : 2*id%N)
1630 CALL MUMPS_I8REALLOC(SNDCNT, NPROCS, id%INFO, LP,
1631 & MEMCNT=MEMCNT, ERRCODE=-7)
1632 CALL MUMPS_I8REALLOC(RCVCNT, NPROCS, id%INFO, LP,
1633 & MEMCNT=MEMCNT, ERRCODE=-7)
1634 CALL MUMPS_I8REALLOC(MSGCNT, NPROCS, id%INFO, LP,
1635 & MEMCNT=MEMCNT, ERRCODE=-7)
1636 CALL MUMPS_REALLOC(RDISPL, NPROCS, id%INFO, LP,
1637 & MEMCNT=MEMCNT, ERRCODE=-7)
1638.GT.
IF(MEMCNT MAXMEM) MAXMEM=MEMCNT
1639 ALLOCATE(APNT(NPROCS), stat=allocok)
1640.GT.
IF(allocok0) THEN
1644 CALL MUMPS_PROPINFO( id%ICNTL(1), id%INFO(1), id%COMM, id%MYID )
1645.LT.
IF ( id%INFO(1) 0 ) GO TO 90
1649 LOCNNZ = id%KEEP8(29)
1650 NROWS_LOC = ord%LAST(MYID+1)-ord%FIRST(MYID+1)+1
1654.GT.
IF((ord%LAST(I)-ord%FIRST(I)+1) MAXS) THEN
1655 MAXS = ord%LAST(I)-ord%FIRST(I)+1
1657 DO J=ord%FIRST(I), ord%LAST(I)
1658 MAPTAB(ord%PERITAB(J)) = I
1661 ALLOCATE(SIPES(max(1,MAXS), NPROCS), stat=allocok)
1662.GT.
IF(allocok0) THEN
1664 id%INFO(2)=max(1,MAXS)*NPROCS
1666 CALL MUMPS_PROPINFO( id%ICNTL(1), id%INFO(1), id%COMM, id%MYID )
1667.LT.
IF ( id%INFO(1) 0 ) GO TO 90
1671.NE.
IF(id%IRN_loc(INNZ) id%JCN_loc(INNZ)) THEN
1672 PROC = MAPTAB(id%IRN_loc(INNZ))
1676 IIDX = ord%PERMTAB(id%IRN_loc(INNZ))
1677 LOC_ROW = IIDX-ord%FIRST(PROC)+1
1678 SIPES(LOC_ROW, PROC) = SIPES(LOC_ROW, PROC)+1
1679 SNDCNT(PROC) = SNDCNT(PROC)+1
1681 PROC = MAPTAB(id%JCN_loc(INNZ))
1685 IIDX = ord%PERMTAB(id%JCN_loc(INNZ))
1686 LOC_ROW = IIDX-ord%FIRST(PROC)+1
1687 SIPES(LOC_ROW, PROC) = SIPES(LOC_ROW, PROC)+1
1688 SNDCNT(PROC) = SNDCNT(PROC)+1
1692 CALL MPI_ALLTOALL(SNDCNT(1), 1, MPI_INTEGER8, RCVCNT(1), 1,
1693 & MPI_INTEGER8, id%COMM, IERR)
1694 I = ceiling(real(MAXS)*1.20E0)
1695 CALL MUMPS_REALLOC(LENG, max(I,1), id%INFO,
1696 & LP, STRING='b_l_g:leng
', MEMCNT=MEMCNT, ERRCODE=-7)
1697.GT.
IF(MEMCNT MAXMEM) MAXMEM=MEMCNT
1698 CALL MUMPS_I8DEALLOC(SNDCNT, MEMCNT=MEMCNT)
1700 CALL MPI_REDUCE_SCATTER ( SIPES(1,1), LENG(1), RDISPL(1),
1701 & MPI_INTEGER, MPI_SUM, id%COMM, IERR )
1703 I = ceiling(real(NROWS_LOC+1)*1.20E0)
1704 CALL MUMPS_I8REALLOC(IPE, max(I,1), id%INFO,
1705 & LP, STRING='b_l_g:ipe
', MEMCNT=MEMCNT, ERRCODE=-7)
1706.GT.
IF(MEMCNT MAXMEM) MAXMEM=MEMCNT
1710 IPE(I+1) = IPE(I) + int(LENG(I),8)
1711 TLEN = TLEN+int(LENG(I),8)
1713 CALL MUMPS_IREALLOC8(TSENDI, max(TOP_CNT,1_8), id%INFO, LP,
1714 & MEMCNT=MEMCNT, ERRCODE=-7)
1715 CALL MUMPS_IREALLOC8(TSENDJ, max(TOP_CNT,1_8), id%INFO, LP,
1716 & MEMCNT=MEMCNT, ERRCODE=-7)
1717.GT.
IF(MEMCNT MAXMEM) MAXMEM=MEMCNT
1719 CALL MUMPS_REALLOC(BUFLEVEL, NPROCS, id%INFO, LP,
1720 & MEMCNT=MEMCNT, ERRCODE=-7)
1721 CALL CMUMPS_SEND_BUF(APNT, PROC, NPROCS, BUFSIZE, IPE, PE,
1722 & LENG, RCVBUF, MSGCNT, BUFLEVEL, id%COMM)
1725 NEW_LOCNNZ = NEW_LOCNNZ + RCVCNT(I)
1726 MSGCNT(I) = RCVCNT(I)/int(BUFSIZE,8)
1728 CALL MUMPS_IREALLOC8(PE, max(NEW_LOCNNZ+
1729 & 2_8*int(NROWS_LOC+ord%TOPNODES(2),8),1_8),
1730 & id%INFO, LP, STRING='b_l_g:pe
', MEMCNT=MEMCNT, ERRCODE=-7)
1731.GT.
IF(MEMCNT MAXMEM) MAXMEM=MEMCNT
1736.EQ.
IF(mod(INNZ,int(BUFSIZE/10,8)) 0) THEN
1737 CALL MPI_IPROBE( MPI_ANY_SOURCE, ITAG, id%COMM,
1738 & FLAG, STATUS, IERR )
1740 SOURCE = STATUS(MPI_SOURCE)
1741 CALL MPI_RECV(RCVBUF(1), 2*BUFSIZE, MPI_INTEGER, SOURCE,
1742 & ITAG, id%COMM, STATUS, IERR)
1743 CALL CMUMPS_ASSEMBLE_MSG(BUFSIZE, RCVBUF, IPE, PE, LENG)
1744 MSGCNT(SOURCE+1)=MSGCNT(SOURCE+1)-1
1745 RCVPNT = RCVPNT + BUFSIZE
1748.NE.
IF(id%IRN_loc(INNZ) id%JCN_loc(INNZ)) THEN
1749 PROC = MAPTAB(id%IRN_loc(INNZ))
1750.NE..AND.
IF((MAPTAB(id%JCN_loc(INNZ))PROC)
1751.NE..AND.
& (MAPTAB(id%JCN_loc(INNZ))0)
1758 TSENDI(TIDX) = id%IRN_loc(INNZ)
1759 TSENDJ(TIDX) = id%JCN_loc(INNZ)
1761 IIDX = ord%PERMTAB(id%IRN_loc(INNZ))
1762 JJDX = ord%PERMTAB(id%JCN_loc(INNZ))
1763 APNT(PROC)%BUF(2*BUFLEVEL(PROC)+1)=IIDX-ord%FIRST(PROC)+1
1764.GE..AND.
IF( (JJDX ord%FIRST(PROC))
1765.LE.
& (JJDX ord%LAST(PROC)) ) THEN
1766 APNT(PROC)%BUF(2*BUFLEVEL(PROC)+2) =
1767 & JJDX-ord%FIRST(PROC)+1
1769 APNT(PROC)%BUF(2*BUFLEVEL(PROC)+2) = -id%JCN_loc(INNZ)
1771 BUFLEVEL(PROC) = BUFLEVEL(PROC)+1
1772.EQ.
IF(BUFLEVEL(PROC) BUFSIZE) THEN
1773 CALL CMUMPS_SEND_BUF(APNT, PROC, NPROCS, BUFSIZE, IPE,
1774 & PE, LENG, RCVBUF, MSGCNT, BUFLEVEL, id%COMM)
1777 PROC = MAPTAB(id%JCN_loc(INNZ))
1780 TSENDI(TIDX) = id%JCN_loc(INNZ)
1781 TSENDJ(TIDX) = id%IRN_loc(INNZ)
1783 IIDX = ord%PERMTAB(id%JCN_loc(INNZ))
1784 JJDX = ord%PERMTAB(id%IRN_loc(INNZ))
1785 APNT(PROC)%BUF(2*BUFLEVEL(PROC)+1) =
1786 & IIDX-ord%FIRST(PROC)+1
1787.GE..AND.
IF( (JJDX ord%FIRST(PROC))
1788.LE.
& (JJDX ord%LAST(PROC)) ) THEN
1789 APNT(PROC)%BUF(2*BUFLEVEL(PROC)+2) =
1790 & JJDX-ord%FIRST(PROC)+1
1792 APNT(PROC)%BUF(2*BUFLEVEL(PROC)+2) = -id%IRN_loc(INNZ)
1794 BUFLEVEL(PROC) = BUFLEVEL(PROC)+1
1795.EQ.
IF(BUFLEVEL(PROC) BUFSIZE) THEN
1796 CALL CMUMPS_SEND_BUF(APNT, PROC, NPROCS, BUFSIZE, IPE,
1797 & PE, LENG, RCVBUF, MSGCNT, BUFLEVEL, id%COMM)
1802 CALL CMUMPS_SEND_BUF(APNT, -1, NPROCS, BUFSIZE, IPE, PE, LENG,
1803 & RCVBUF, MSGCNT, BUFLEVEL, id%COMM)
1811 DO INNZ=IPE(I),IPE(I+1)-1
1812.LT.
IF(PE(INNZ) 0) THEN
1813.EQ.
IF(HALO_MAP(-PE(INNZ)) 0) THEN
1814 HALO_SIZE = HALO_SIZE+1
1815 HALO_MAP(-PE(INNZ)) = NROWS_LOC+HALO_SIZE
1817 PE(INNZ) = HALO_MAP(-PE(INNZ))
1819.EQ.
IF(MAPTAB(PE(INNZ)) I) THEN
1823 MAPTAB(PE(INNZ)) = I
1831 IPE(NROWS_LOC+1) = SAVEPNT
1832 CALL MUMPS_REALLOC(I_HALO_MAP, HALO_SIZE, id%INFO, LP,
1833 & MEMCNT=MEMCNT, ERRCODE=-7)
1834.GT.
IF(MEMCNT MAXMEM) MAXMEM=MEMCNT
1837.GT.
IF(HALO_MAP(I) 0) THEN
1839 I_HALO_MAP(HALO_MAP(I)-NROWS_LOC) = I
1841.EQ.
IF(J HALO_SIZE) EXIT
1843 CALL MUMPS_REALLOC(LENG, max(NROWS_LOC+HALO_SIZE,1), id%INFO,
1845 & STRING='lcgrph:leng
', MEMCNT=MEMCNT, ERRCODE=-7)
1846 LENG(NROWS_LOC+1:NROWS_LOC+HALO_SIZE) = 0
1847 CALL MUMPS_I8REALLOC(IPE, NROWS_LOC+HALO_SIZE+1, id%INFO,
1849 & STRING='lcgrph:ipe
', MEMCNT=MEMCNT, ERRCODE=-7)
1850.GT.
IF(MEMCNT MAXMEM) MAXMEM=MEMCNT
1851 IPE(NROWS_LOC+2:NROWS_LOC+HALO_SIZE+1) = IPE(NROWS_LOC+1)
1852 GSIZE = NROWS_LOC + HALO_SIZE
1853 CALL MPI_GATHER(TOP_CNT, 1, MPI_INTEGER8, RCVCNT(1), 1,
1854 & MPI_INTEGER8, 0, id%COMM, IERR)
1856 NEW_LOCNNZ = sum(RCVCNT)
1857 top_graph%NZ_LOC = NEW_LOCNNZ
1858 top_graph%COMM = id%COMM
1859 CALL MUMPS_IREALLOC8(top_graph%IRN_LOC, max(1_8,NEW_LOCNNZ),
1860 & id%INFO, LP, MEMCNT=MEMCNT, ERRCODE=-7)
1861 CALL MUMPS_IREALLOC8(top_graph%JCN_LOC, max(1_8,NEW_LOCNNZ),
1862 & id%INFO, LP, MEMCNT=MEMCNT, ERRCODE=-7)
1863.GT.
IF(MEMCNT MAXMEM) MAXMEM=MEMCNT
1864 CALL MUMPS_PROPINFO( id%ICNTL(1), id%INFO(1), id%COMM, id%MYID)
1865.LT.
IF ( id%INFO(1) 0 ) GO TO 90
1867 ALLOCATE(top_graph%IRN_LOC(1), top_graph%JCN_LOC(1),
1869.GT.
IF(allocok0) THEN
1873 CALL MUMPS_PROPINFO( id%ICNTL(1), id%INFO(1), id%COMM, id%MYID)
1874.LT.
IF ( id%INFO(1) 0 ) GO TO 90
1877 top_graph%IRN_LOC(1:TOP_CNT) = TSENDI(1:TOP_CNT)
1878 top_graph%JCN_LOC(1:TOP_CNT) = TSENDJ(1:TOP_CNT)
1880.GT.
DO WHILE (RCVCNT(PROC) 0)
1881 I = int(min(int(BUFSIZE,8), RCVCNT(PROC)))
1882 CALL MPI_RECV(top_graph%IRN_LOC(TOP_CNT+1), I,
1883 & MPI_INTEGER, PROC-1, ITAG, id%COMM, STATUS, IERR)
1884 CALL MPI_RECV(top_graph%JCN_LOC(TOP_CNT+1), I,
1885 & MPI_INTEGER, PROC-1, ITAG, id%COMM, STATUS, IERR)
1886 RCVCNT(PROC) = RCVCNT(PROC)-I
1891.GT.
DO WHILE (TOP_CNT 0)
1892 I = int(MIN(int(BUFSIZE,8), TOP_CNT))
1893 CALL MPI_SEND(TSENDI(TOP_CNT-I+1), I,
1894 & MPI_INTEGER, 0, ITAG, id%COMM, IERR)
1895 CALL MPI_SEND(TSENDJ(TOP_CNT-I+1), I,
1896 & MPI_INTEGER, 0, ITAG, id%COMM, IERR)
1900 CALL MUMPS_DEALLOC(BUFLEVEL, RDISPL, TSENDI,
1901 & TSENDJ, MEMCNT=MEMCNT)
1902 CALL MUMPS_I8DEALLOC(MSGCNT, SNDCNT, RCVCNT, MEMCNT=MEMCNT)
1906 END SUBROUTINE CMUMPS_BUILD_LOC_GRAPH
1907 SUBROUTINE CMUMPS_SEND_BUF(APNT, PROC, NPROCS, BUFSIZE, IPE, PE,
1908 & LENG, RCVBUF, MSGCNT, SNDCNT, COMM)
1910 INTEGER :: NPROCS, PROC, COMM, allocok
1911 TYPE(ARRPNT) :: APNT(:)
1913 INTEGER, POINTER :: RCVBUF(:), LENG(:), PE(:)
1914 INTEGER :: SNDCNT(:)
1915 INTEGER(8) :: MSGCNT(:), IPE(:)
1916 LOGICAL, SAVE :: INIT = .TRUE.
1917 INTEGER, POINTER, SAVE :: SPACE(:,:,:)
1918 LOGICAL, POINTER, SAVE :: PENDING(:)
1919 INTEGER, POINTER, SAVE :: REQ(:), CPNT(:)
1920 INTEGER :: IERR, MYID, I, SOURCE
1921 INTEGER(8) :: TOTMSG
1922 LOGICAL :: FLAG, TFLAG
1923 INTEGER :: STATUS(MPI_STATUS_SIZE)
1924 INTEGER :: TSTATUS(MPI_STATUS_SIZE)
1925 INTEGER, PARAMETER :: ITAG=30, FTAG=31
1926 INTEGER, POINTER :: TMPI(:), RCVCNT(:)
1927 CALL MPI_COMM_RANK (COMM, MYID, IERR)
1928 CALL MPI_COMM_SIZE (COMM, NPROCS, IERR)
1930 ALLOCATE(SPACE(2*BUFSIZE, 2, NPROCS), stat=allocok)
1931.GT.
IF(allocok0) THEN
1932 write(*,*) "Allocation error of SPACE in CMUMPS_SEND_BUF"
1935 ALLOCATE(RCVBUF(2*BUFSIZE), stat=allocok)
1936.GT.
IF(allocok0) THEN
1937 write(*,*) "Allocation error of RCVBUF in CMUMPS_SEND_BUF"
1940 ALLOCATE(PENDING(NPROCS), CPNT(NPROCS), stat=allocok)
1941.GT.
IF(allocok0) THEN
1942 write(*,*) "Allocation error of PENDING/CPNT"
1943 & ," in CMUMPS_SEND_BUF"
1946 ALLOCATE(REQ(NPROCS), stat=allocok)
1947.GT.
IF(allocok0) THEN
1948 write(*,*) "Allocation error of REQ in CMUMPS_SEND_BUF"
1953 APNT(I)%BUF => SPACE(:,1,I)
1959.EQ.
IF(PROC -1) THEN
1960 TOTMSG = sum(MSGCNT)
1962.EQ.
IF(TOTMSG 0) EXIT
1963 CALL MPI_RECV(RCVBUF(1), 2*BUFSIZE, MPI_INTEGER,
1964 & MPI_ANY_SOURCE, ITAG, COMM, STATUS, IERR)
1965 CALL CMUMPS_ASSEMBLE_MSG(BUFSIZE, RCVBUF, IPE, PE, LENG)
1966 SOURCE = STATUS(MPI_SOURCE)
1968 MSGCNT(SOURCE+1)=MSGCNT(SOURCE+1)-1
1972 CALL MPI_WAIT(REQ(I), TSTATUS, IERR)
1975 ALLOCATE(RCVCNT(NPROCS), stat=allocok)
1976.GT.
IF(allocok0) THEN
1977 write(*,*) "Allocation error of RCVCNT in CMUMPS_SEND_BUF"
1980 CALL MPI_ALLTOALL(SNDCNT(1), 1, MPI_INTEGER, RCVCNT(1), 1,
1981 & MPI_INTEGER, COMM, IERR)
1983.GT.
IF(SNDCNT(I) 0) THEN
1984 TMPI => APNT(I)%BUF(:)
1985 CALL MPI_ISEND(TMPI(1), 2*SNDCNT(I), MPI_INTEGER, I-1,
1986 & FTAG, COMM, REQ(I), IERR)
1990.GT.
IF(RCVCNT(I) 0) THEN
1991 CALL MPI_RECV(RCVBUF(1), 2*RCVCNT(I), MPI_INTEGER, I-1,
1992 & FTAG, COMM, STATUS, IERR)
1993 CALL CMUMPS_ASSEMBLE_MSG(RCVCNT(I), RCVBUF,
1998.GT.
IF(SNDCNT(I) 0) THEN
1999 CALL MPI_WAIT(REQ(I), TSTATUS, IERR)
2003 DEALLOCATE(PENDING, CPNT)
2005 DEALLOCATE(RCVBUF, RCVCNT)
2006 nullify(SPACE, PENDING, CPNT, REQ, RCVBUF, RCVCNT)
2010 IF(PENDING(PROC)) THEN
2012 CALL MPI_TEST(REQ(PROC), TFLAG, TSTATUS, IERR)
2014 PENDING(PROC) = .FALSE.
2017 CALL MPI_IPROBE( MPI_ANY_SOURCE, ITAG, COMM,
2018 & FLAG, STATUS, IERR )
2020 SOURCE = STATUS(MPI_SOURCE)
2021 CALL MPI_RECV(RCVBUF(1), 2*BUFSIZE, MPI_INTEGER,
2022 & SOURCE, ITAG, COMM, STATUS, IERR)
2023 CALL CMUMPS_ASSEMBLE_MSG(BUFSIZE, RCVBUF, IPE,
2025 MSGCNT(SOURCE+1)=MSGCNT(SOURCE+1)-1
2030 TMPI => APNT(PROC)%BUF(:)
2031 CALL MPI_ISEND(TMPI(1), 2*BUFSIZE, MPI_INTEGER, PROC-1,
2032 & ITAG, COMM, REQ(PROC), IERR)
2033 PENDING(PROC) = .TRUE.
2034 CPNT(PROC) = mod(CPNT(PROC),2)+1
2035 APNT(PROC)%BUF => SPACE(:,CPNT(PROC),PROC)
2038 END SUBROUTINE CMUMPS_SEND_BUF
2039 SUBROUTINE CMUMPS_ASSEMBLE_MSG(BUFSIZE, RCVBUF, IPE, PE, LENG)
2042 INTEGER :: RCVBUF(:), PE(:), LENG(:)
2043 INTEGER(8) :: IPE(:)
2044 INTEGER :: I, ROW, COL
2045 DO I=1, 2*BUFSIZE, 2
2048 PE(IPE(ROW)+LENG(ROW)) = COL
2049 LENG(ROW) = LENG(ROW) + 1
2052 END SUBROUTINE CMUMPS_ASSEMBLE_MSG
2053#if defined(ptscotch) || defined(parmetis) || defined(parmetis3)
2054 SUBROUTINE CMUMPS_BUILD_TREE(ord)
2055 TYPE(ORD_TYPE) :: ord
2061 ord%NW(I) = ord%NW(I)+ord%RANGTAB(I+1) - ord%RANGTAB(I)
2062.NE.
IF (ord%TREETAB(I) -1) THEN
2063.EQ.
IF (ord%SON(ord%TREETAB(I)) -1) THEN
2064 ord%SON(ord%TREETAB(I)) = I
2066 ord%BROTHER(I) = ord%SON(ord%TREETAB(I))
2067 ord%SON(ord%TREETAB(I)) = I
2069 ord%NW(ord%TREETAB(I)) = ord%NW(ord%TREETAB(I))+ ord%NW(I)
2073 END SUBROUTINE CMUMPS_BUILD_TREE
2074 SUBROUTINE CMUMPS_GRAPH_DIST(id, ord, FIRST,
2075 & LAST, BASE, NPROCS, WORK, TYPE)
2077 TYPE(CMUMPS_STRUC) :: id
2078 TYPE(ORD_TYPE) :: ord
2079 INTEGER :: FIRST(:), LAST(:), BASE, NPROCS, TYPE
2080 INTEGER, TARGET :: WORK(:)
2081 INTEGER, POINTER :: TMP(:), NZ_ROW(:)
2082 INTEGER :: I, IERR, P, F, J
2083 INTEGER(8) :: LOCNNZ, INNZ, LOCOFFDIAG,
2090 SHARE = int(id%N/ord%NSLAVES,8)
2092 FIRST(BASE+I) = (I-1)*int(SHARE)+1
2093 LAST (BASE+I) = (I)*int(SHARE)
2095 LAST(BASE+ord%NSLAVES) = MAX(LAST(BASE+ord%NSLAVES), id%N)
2096 DO I = ord%NSLAVES+1, id%NSLAVES+1
2097 FIRST(BASE+I) = id%N+1
2098 LAST (BASE+I) = id%N
2100.EQ.
ELSE IF (TYPE2) THEN
2102 NZ_ROW => WORK(id%N+1:2*id%N)
2105 LOCNNZ = id%KEEP8(29)
2107.NE.
IF(id%IRN_loc(INNZ) id%JCN_loc(INNZ)) THEN
2108 TMP(id%IRN_loc(INNZ)) = TMP(id%IRN_loc(INNZ))+1
2109 LOCOFFDIAG = LOCOFFDIAG+1
2110.GT.
IF(id%SYM0) THEN
2111 TMP(id%JCN_loc(INNZ)) = TMP(id%JCN_loc(INNZ))+1
2112 LOCOFFDIAG = LOCOFFDIAG+1
2116 CALL MPI_ALLREDUCE(TMP(1), NZ_ROW(1), id%N,
2117 & MPI_INTEGER, MPI_SUM, id%COMM, IERR)
2118 CALL MPI_ALLREDUCE(LOCOFFDIAG, OFFDIAG, 1,
2119 & MPI_INTEGER8, MPI_SUM, id%COMM, IERR)
2121 SHARE = (OFFDIAG-1_8)/int(ord%NSLAVES,8) + 1_8
2126 T = T+int(NZ_ROW(I),8)
2129.EQ..OR.
& ((id%N-I)(ord%NSLAVES-P-1))
2133.EQ.
IF(Pord%NSLAVES) THEN
2145 DO J=P+1, NPROCS+1-BASE
2146 FIRST(BASE+J) = id%N+1
2151 END SUBROUTINE CMUMPS_GRAPH_DIST
2153 SUBROUTINE CMUMPS_MERGESWAP(N, L, A1, A2)
2154 INTEGER :: I, LP, ISWAP, N
2155 INTEGER :: L(0:), A1(:), A2(:)
2159.OR.
IF ((LP==0)(I>N)) EXIT
2176 END SUBROUTINE CMUMPS_MERGESWAP
2177#if defined(DETERMINISTIC_PARALLEL_GRAPH)
2178 SUBROUTINE CMUMPS_MERGESWAP1(N, L, A)
2179 INTEGER :: I, LP, ISWAP, N
2180 INTEGER :: L(0:), A(:)
2184.OR.
IF ((LP==0)(I>N)) EXIT
2198 END SUBROUTINE CMUMPS_MERGESWAP1
2200 SUBROUTINE CMUMPS_MERGESORT(N, K, L)
2202 INTEGER :: K(:), L(0:)
2203 INTEGER :: P, Q, S, T
2208 IF (K(P) <= K(P+1)) THEN
2217 IF (L(N+1) == 0) THEN
2220 L(N+1) = iabs(L(N+1))
2229.GT.
IF(K(P) K(Q)) GOTO 600
2234.GT.
IF (P 0) GOTO 300
2245 L(S) = sign(Q, L(S))
2248.GT.
IF (Q 0) GOTO 300
2261 L(S) = sign(P, L(S))
2266 END SUBROUTINE CMUMPS_MERGESORT
2267 FUNCTION MUMPS_GETSIZE(A)
2268 INTEGER, POINTER :: A(:)
2269 INTEGER :: MUMPS_GETSIZE
2270 IF(associated(A)) THEN
2271 MUMPS_GETSIZE = size(A)
2276 END FUNCTION MUMPS_GETSIZE
2277#if defined(parmetis) || defined(parmetis3)
2278 SUBROUTINE MUMPS_PARMETIS_MIXEDto32(id, BASE, VERTLOCNBR, FIRST,
2279 & VERTLOCTAB, EDGELOCTAB, BASEVAL, OPTIONS, ORDER,
2280 & SIZES, COMM, IERR)
2282 TYPE(CMUMPS_STRUC) :: id
2283 INTEGER :: FIRST(:), EDGELOCTAB(:), OPTIONS(:)
2284 INTEGER :: SIZES(:), ORDER(:)
2285 INTEGER(8) :: VERTLOCTAB(:)
2286 INTEGER :: VERTLOCNBR, BASEVAL, IERR, COMM, BASE
2287 INTEGER, POINTER :: VERTLOCTAB_I4(:)
2288.GT.
IF( VERTLOCTAB(VERTLOCNBR+1)huge(VERTLOCNBR)) THEN
2290 CALL MUMPS_SET_IERROR(
2291 & VERTLOCTAB(VERTLOCNBR+1), id%INFO(2))
2294 nullify(VERTLOCTAB_I4)
2295 CALL MUMPS_REALLOC(VERTLOCTAB_I4, VERTLOCNBR+1, id%INFO,
2296 & id%ICNTL(1), MEMCNT=MEMCNT, ERRCODE=-7)
2297 CALL MUMPS_PROPINFO( id%ICNTL(1), id%INFO(1),
2299.LT.
IF ( id%INFO(1) 0 ) RETURN
2300 CALL MUMPS_ICOPY_64TO32(VERTLOCTAB(1),
2301 & VERTLOCNBR+1, VERTLOCTAB_I4(1))
2302 CALL MUMPS_PARMETIS(FIRST(1+BASE), VERTLOCTAB_I4(1),
2303 & EDGELOCTAB(1), BASEVAL, OPTIONS(1), ORDER(1),
2304 & SIZES(1), COMM, IERR)
2308 CALL MUMPS_DEALLOC(VERTLOCTAB_I4, MEMCNT=MEMCNT)
2310 END SUBROUTINE MUMPS_PARMETIS_MIXEDto32
2311 SUBROUTINE MUMPS_PARMETIS_MIXEDto64
2312 & (id, BASE, VERTLOCNBR, FIRST,
2313 & VERTLOCTAB, EDGELOCTAB, BASEVAL, OPTIONS, ORDER,
2314 & SIZES, COMM, IERR)
2316 TYPE(CMUMPS_STRUC) :: id
2317 INTEGER :: FIRST(:), EDGELOCTAB(:), OPTIONS(:)
2318 INTEGER :: SIZES(:), ORDER(:)
2319 INTEGER(8) :: VERTLOCTAB(:)
2320 INTEGER :: VERTLOCNBR, BASEVAL, IERR, COMM, BASE
2321 INTEGER(8), POINTER :: FIRST_I8(:), EDGELOCTAB_I8(:),
2322 & SIZES_I8(:), ORDER_I8(:)
2323#if defined(parmetis)
2324 INTEGER(8), POINTER :: OPTIONS_I8(:)
2325 INTEGER(8) :: BASEVAL_I8
2327.NE.
IF (id%KEEP(10)1) THEN
2328 CALL MUMPS_I8REALLOC(OPTIONS_I8, size(OPTIONS), id%INFO,
2329 & id%ICNTL(1), MEMCNT=MEMCNT, ERRCODE=-7)
2330.LT.
IF ( id%INFO(1) 0 ) RETURN
2331 CALL MUMPS_ICOPY_32TO64(OPTIONS(1), size(OPTIONS)
2333 BASEVAL_I8 = int(BASEVAL,8)
2336 nullify(FIRST_I8, EDGELOCTAB_I8, SIZES_I8, ORDER_I8)
2337.EQ.
IF (id%KEEP(10)1) THEN
2338 CALL MUMPS_PARMETIS_64(FIRST(1+BASE), VERTLOCTAB(1),
2340 & BASEVAL, OPTIONS(1),
2342 & SIZES(1), COMM, IERR)
2344 CALL MUMPS_I8REALLOC(FIRST_I8, size(FIRST), id%INFO,
2345 & id%ICNTL(1), MEMCNT=MEMCNT, ERRCODE=-7)
2346.LT.
IF ( id%INFO(1) 0 ) GOTO 5
2347 CALL MUMPS_I8REALLOC8(EDGELOCTAB_I8,
2348 & VERTLOCTAB(VERTLOCNBR+1)-1_8,
2349 & id%INFO, id%ICNTL(1), MEMCNT=MEMCNT, ERRCODE=-7)
2350.LT.
IF ( id%INFO(1) 0 ) GOTO 5
2351 CALL MUMPS_I8REALLOC(SIZES_I8, size(SIZES), id%INFO,
2352 & id%ICNTL(1), MEMCNT=MEMCNT, ERRCODE=-7)
2353.LT.
IF ( id%INFO(1) 0 ) GOTO 5
2354 CALL MUMPS_I8REALLOC(ORDER_I8, size(ORDER), id%INFO,
2355 & id%ICNTL(1), MEMCNT=MEMCNT, ERRCODE=-7)
2356.LT.
IF ( id%INFO(1) 0 ) GOTO 5
2358 CALL MUMPS_PROPINFO( id%ICNTL(1), id%INFO(1),
2360.LT.
IF ( id%INFO(1) 0 ) RETURN
2361 CALL MUMPS_ICOPY_32TO64(FIRST(1), size(FIRST), FIRST_I8(1))
2362 CALL MUMPS_ICOPY_32TO64_64C(EDGELOCTAB(1),
2363 & VERTLOCTAB(VERTLOCNBR+1)-1_8, EDGELOCTAB_I8(1))
2364 CALL MUMPS_PARMETIS_64(FIRST_I8(1+BASE), VERTLOCTAB(1),
2366#if defined(parmetis3)
2367 & BASEVAL, OPTIONS(1),
2369 & BASEVAL_I8, OPTIONS_I8(1),
2372 & SIZES_I8(1), COMM, IERR)
2377 CALL MUMPS_PROPINFO( id%ICNTL(1), id%INFO(1),
2379.LT.
IF ( id%INFO(1) 0 ) GOTO 10
2380.NE.
IF ( id%KEEP(10) 1 ) THEN
2381 CALL MUMPS_ICOPY_64TO32(ORDER_I8(1),
2382 & size(ORDER), ORDER(1))
2383 CALL MUMPS_ICOPY_64TO32(SIZES_I8(1),
2384 & size(SIZES), SIZES(1))
2387 CALL MUMPS_I8DEALLOC(FIRST_I8, MEMCNT=MEMCNT)
2388 CALL MUMPS_I8DEALLOC(SIZES_I8, MEMCNT=MEMCNT)
2389 CALL MUMPS_I8DEALLOC(EDGELOCTAB_I8, MEMCNT=MEMCNT)
2390 CALL MUMPS_I8DEALLOC(ORDER_I8, MEMCNT=MEMCNT)
2391#if defined(parmetis)
2392 CALL MUMPS_I8DEALLOC(OPTIONS_I8, MEMCNT=MEMCNT)
2395 END SUBROUTINE MUMPS_PARMETIS_MIXEDto64
2397#if defined(ptscotch)
2398 SUBROUTINE MUMPS_PTSCOTCH_MIXEDto32(id, ord,
2400 & VERTLOCNBR, VERTLOCTAB,
2401 & EDGELOCNBR, EDGELOCTAB,
2404 INCLUDE 'ptscotchf.h
'
2405 TYPE(CMUMPS_STRUC) :: id
2406 TYPE(ORD_TYPE) :: ord
2407 INTEGER :: BASEVAL, VERTLOCNBR
2408 INTEGER(8) :: EDGELOCNBR
2409 INTEGER(8) :: VERTLOCTAB(:)
2410 INTEGER :: EDGELOCTAB(:)
2412 INTEGER, POINTER :: VERTLOCTAB_I4(:)
2413 INTEGER :: EDGELOCNBR_I4, MYWORKID
2414 DOUBLE PRECISION :: GRAPHDAT(SCOTCH_DGRAPHDIM),
2415 & ORDEDAT(SCOTCH_DORDERDIM), STRADAT(SCOTCH_STRATDIM),
2416 & CORDEDAT(SCOTCH_ORDERDIM)
2417 CHARACTER STRSTRING*1024
2418 nullify(VERTLOCTAB_I4)
2419 CALL MUMPS_REALLOC(VERTLOCTAB_I4, VERTLOCNBR+1, id%INFO, LP,
2420 & MEMCNT=MEMCNT, ERRCODE=-7)
2421 CALL MUMPS_PROPINFO( id%ICNTL(1), id%INFO(1),
2422 & ord%COMM_NODES, id%MYID )
2423.LT.
IF ( id%INFO(1) 0 ) RETURN
2424 CALL MUMPS_ICOPY_64TO32(VERTLOCTAB(1),
2425 & VERTLOCNBR+1, VERTLOCTAB_I4(1))
2426 EDGELOCNBR_I4 = int(EDGELOCNBR)
2427.NE.
IF(ord%SUBSTRAT 0) THEN
2428 STRSTRING='n{sep=m{asc=b{width=3,strat=q{strat=f}},
'//
2429 & 'low=q{strat=h},vert=1000,dvert=100,dlevl=0,
'//
2430 & 'proc=1,seq=q{strat=m{type=h,vert=100,
'//
2431 & 'low=h{pass=10},asc=b{width=3,bnd=f{bal=0.2},
'//
2432 & 'org=h{pass=10}f{bal=0.2}}}}},ole=s,ose=s,osq=s}
'
2435 CALL MPI_COMM_RANK (ord%COMM_NODES, MYWORKID, IERR)
2439 CALL MUMPS_DGRAPHINIT(GRAPHDAT, ord%COMM_NODES, IERR)
2443 CALL MUMPS_PROPINFO( id%ICNTL(1), id%INFO(1),
2444 & ord%COMM_NODES, id%MYID )
2445.LT.
IF ( id%INFO(1) 0 ) GOTO 10
2446 CALL SCOTCHFDGRAPHBUILD(GRAPHDAT, BASEVAL, VERTLOCNBR,
2447 & VERTLOCNBR, VERTLOCTAB_I4(1), VERTLOCTAB_I4(2),
2448 & VERTLOCTAB_I4(1), VERTLOCTAB_I4(1), EDGELOCNBR_I4,
2449 & EDGELOCNBR_I4, EDGELOCTAB(1), EDGELOCTAB(1),
2450 & EDGELOCTAB(1), IERR)
2454 CALL MUMPS_PROPINFO( id%ICNTL(1), id%INFO(1),
2455 & ord%COMM_NODES, id%MYID )
2456.LT.
IF ( id%INFO(1) 0 ) GOTO 10
2457 CALL SCOTCHFSTRATINIT(STRADAT, IERR)
2461 CALL MUMPS_PROPINFO( id%ICNTL(1), id%INFO(1),
2462 & ord%COMM_NODES, id%MYID )
2463.LT.
IF ( id%INFO(1) 0 ) GOTO 10
2464.NE.
IF(ord%SUBSTRAT 0) THEN
2465 CALL SCOTCHFSTRATDGRAPHORDER(STRADAT, STRSTRING, IERR)
2470 CALL MUMPS_PROPINFO( id%ICNTL(1), id%INFO(1),
2471 & ord%COMM_NODES, id%MYID )
2472.LT.
IF ( id%INFO(1) 0 ) GOTO 10
2473 CALL SCOTCHFDGRAPHORDERINIT(GRAPHDAT, ORDEDAT, IERR)
2477 CALL MUMPS_PROPINFO( id%ICNTL(1), id%INFO(1),
2478 & ord%COMM_NODES, id%MYID )
2479.LT.
IF ( id%INFO(1) 0 ) GOTO 10
2480 CALL SCOTCHFDGRAPHORDERCOMPUTE(GRAPHDAT, ORDEDAT, STRADAT,
2485 CALL MUMPS_PROPINFO( id%ICNTL(1), id%INFO(1),
2486 & ord%COMM_NODES, id%MYID )
2487.LT.
IF ( id%INFO(1) 0 ) GOTO 10
2488.EQ.
IF(MYWORKID 0) THEN
2489 CALL SCOTCHFDGRAPHCORDERINIT(GRAPHDAT, CORDEDAT,
2490 & ord%PERMTAB(1), ord%PERITAB(1), ord%CBLKNBR,
2491 & ord%RANGTAB(1), ord%TREETAB(1), IERR)
2496 CALL MUMPS_PROPINFO( id%ICNTL(1), id%INFO(1),
2497 & ord%COMM_NODES, id%MYID )
2498.LT.
IF ( id%INFO(1) 0 ) GOTO 10
2499.EQ.
IF(MYWORKID 0) THEN
2500 CALL SCOTCHFDGRAPHORDERGATHER(GRAPHDAT, ORDEDAT,
2506 CALL SCOTCHFDGRAPHORDERGATHER(GRAPHDAT, ORDEDAT,
2512 CALL MUMPS_PROPINFO( id%ICNTL(1), id%INFO(1),
2513 & ord%COMM_NODES, id%MYID )
2514.LT.
IF ( id%INFO(1) 0 ) GOTO 10
2516 & CALL SCOTCHFDGRAPHCORDEREXIT(GRAPHDAT, CORDEDAT)
2517 CALL SCOTCHFDGRAPHORDEREXIT(GRAPHDAT, ORDEDAT)
2518 CALL SCOTCHFSTRATEXIT(STRADAT)
2519 CALL SCOTCHFDGRAPHEXIT(GRAPHDAT)
2521 CALL MUMPS_DEALLOC(VERTLOCTAB_I4, MEMCNT=MEMCNT)
2523 END SUBROUTINE MUMPS_PTSCOTCH_MIXEDto32
2524 SUBROUTINE MUMPS_PTSCOTCH_MIXEDto64(id, ord,
2526 & VERTLOCNBR, VERTLOCTAB,
2527 & EDGELOCNBR, EDGELOCTAB,
2530 INCLUDE 'ptscotchf.h
'
2531 TYPE(CMUMPS_STRUC) :: id
2532 TYPE(ORD_TYPE) :: ord
2533 INTEGER :: BASEVAL, VERTLOCNBR
2534 INTEGER(8) :: EDGELOCNBR
2535 INTEGER(8) :: VERTLOCTAB(:)
2536 INTEGER :: EDGELOCTAB(:)
2539 DOUBLE PRECISION :: GRAPHDAT(SCOTCH_DGRAPHDIM),
2540 & ORDEDAT(SCOTCH_DORDERDIM), STRADAT(SCOTCH_STRATDIM),
2541 & CORDEDAT(SCOTCH_ORDERDIM)
2542 CHARACTER STRSTRING*1024
2543 INTEGER(8), POINTER :: EDGELOCTAB_I8(:), PERMTAB_I8(:),
2544 & PERITAB_I8(:), RANGTAB_I8(:), TREETAB_I8(:)
2545 INTEGER(8) :: CBLKNBR_I8, VERTLOCNBR_I8, BASEVAL_I8
2546.NE.
IF(ord%SUBSTRAT 0) THEN
2547 STRSTRING='n{sep=m{asc=b{width=3,strat=q{strat=f}},
'//
2548 & 'low=q{strat=h},vert=1000,dvert=100,dlevl=0,
'//
2549 & 'proc=1,seq=q{strat=m{type=h,vert=100,
'//
2550 & 'low=h{pass=10},asc=b{width=3,bnd=f{bal=0.2},
'//
2551 & 'org=h{pass=10}f{bal=0.2}}}}},ole=s
'
2554 CALL MPI_COMM_RANK (ord%COMM_NODES, MYWORKID, IERR)
2558 nullify(EDGELOCTAB_I8, PERMTAB_I8, PERITAB_I8,
2559 & RANGTAB_I8, TREETAB_I8)
2560.NE.
IF (id%KEEP(10)1) THEN
2561 CALL MUMPS_I8REALLOC8(EDGELOCTAB_I8,
2562 & VERTLOCTAB(VERTLOCNBR+1)-1_8,
2563 & id%INFO, id%ICNTL(1), MEMCNT=MEMCNT, ERRCODE=-7)
2564.LT.
IF ( id%INFO(1) 0 ) GOTO 5
2565.EQ.
IF (MYWORKID 0) THEN
2566 CALL MUMPS_I8REALLOC(PERMTAB_I8, size(ord%PERMTAB),
2567 & id%INFO, id%ICNTL(1), MEMCNT=MEMCNT, ERRCODE=-7)
2568.LT.
IF ( id%INFO(1) 0 ) GOTO 5
2569 CALL MUMPS_I8REALLOC(PERITAB_I8, size(ord%PERITAB),
2570 & id%INFO, id%ICNTL(1), MEMCNT=MEMCNT, ERRCODE=-7)
2571.LT.
IF ( id%INFO(1) 0 ) GOTO 5
2572 CALL MUMPS_I8REALLOC(TREETAB_I8, size(ord%TREETAB),
2573 & id%INFO, id%ICNTL(1), MEMCNT=MEMCNT, ERRCODE=-7)
2574.LT.
IF ( id%INFO(1) 0 ) GOTO 5
2575 CALL MUMPS_I8REALLOC(RANGTAB_I8, size(ord%RANGTAB),
2576 & id%INFO, id%ICNTL(1), MEMCNT=MEMCNT, ERRCODE=-7)
2579 CALL MUMPS_PROPINFO( id%ICNTL(1), id%INFO(1),
2580 & ord%COMM_NODES, id%MYID )
2581.LT.
IF ( id%INFO(1) 0 ) RETURN
2582 CALL MUMPS_ICOPY_32TO64_64C(EDGELOCTAB(1),
2583 & VERTLOCTAB(VERTLOCNBR+1)-1_8, EDGELOCTAB_I8(1))
2584 BASEVAL_I8 = int(BASEVAL,8)
2585 VERTLOCNBR_I8 = int(VERTLOCNBR,8)
2587 CALL MUMPS_DGRAPHINIT(GRAPHDAT, ord%COMM_NODES, IERR)
2591 CALL MUMPS_PROPINFO( id%ICNTL(1), id%INFO(1),
2592 & ord%COMM_NODES, id%MYID )
2593.LT.
IF ( id%INFO(1) 0 ) GOTO 10
2594.NE.
IF (id%KEEP(10)1) THEN
2595 CALL SCOTCHFDGRAPHBUILD(GRAPHDAT, BASEVAL_I8, VERTLOCNBR_I8,
2596 & VERTLOCNBR_I8, VERTLOCTAB(1), VERTLOCTAB(2),
2597 & VERTLOCTAB(1), VERTLOCTAB(1), EDGELOCNBR,
2598 & EDGELOCNBR, EDGELOCTAB_I8(1), EDGELOCTAB_I8(1),
2599 & EDGELOCTAB_I8(1), IERR)
2601 CALL SCOTCHFDGRAPHBUILD(GRAPHDAT, BASEVAL, VERTLOCNBR,
2602 & VERTLOCNBR, VERTLOCTAB(1), VERTLOCTAB(2),
2603 & VERTLOCTAB(1), VERTLOCTAB(1), EDGELOCNBR,
2604 & EDGELOCNBR, EDGELOCTAB(1), EDGELOCTAB(1),
2605 & EDGELOCTAB(1), IERR)
2610 CALL MUMPS_PROPINFO( id%ICNTL(1), id%INFO(1),
2611 & ord%COMM_NODES, id%MYID )
2612.LT.
IF ( id%INFO(1) 0 ) GOTO 10
2613 CALL SCOTCHFSTRATINIT(STRADAT, IERR)
2617 CALL MUMPS_PROPINFO( id%ICNTL(1), id%INFO(1),
2618 & ord%COMM_NODES, id%MYID )
2619.LT.
IF ( id%INFO(1) 0 ) GOTO 10
2620.NE.
IF(ord%SUBSTRAT 0) THEN
2621 CALL SCOTCHFSTRATDGRAPHORDER(STRADAT, STRSTRING, IERR)
2626 CALL MUMPS_PROPINFO( id%ICNTL(1), id%INFO(1),
2627 & ord%COMM_NODES, id%MYID )
2628.LT.
IF ( id%INFO(1) 0 ) GOTO 10
2629 CALL SCOTCHFDGRAPHORDERINIT(GRAPHDAT, ORDEDAT, IERR)
2633 CALL MUMPS_PROPINFO( id%ICNTL(1), id%INFO(1),
2634 & ord%COMM_NODES, id%MYID )
2635.LT.
IF ( id%INFO(1) 0 ) GOTO 10
2636 CALL SCOTCHFDGRAPHORDERCOMPUTE(GRAPHDAT, ORDEDAT, STRADAT,
2641 CALL MUMPS_PROPINFO( id%ICNTL(1), id%INFO(1),
2642 & ord%COMM_NODES, id%MYID )
2643.LT.
IF ( id%INFO(1) 0 ) GOTO 10
2644.EQ.
IF(MYWORKID 0) THEN
2645.NE.
IF (id%KEEP(10)1) THEN
2646 CALL SCOTCHFDGRAPHCORDERINIT(GRAPHDAT, CORDEDAT,
2647 & PERMTAB_I8(1), PERITAB_I8(1), CBLKNBR_I8, RANGTAB_I8(1),
2648 & TREETAB_I8(1), IERR)
2650 CALL SCOTCHFDGRAPHCORDERINIT(GRAPHDAT, CORDEDAT,
2651 & ord%PERMTAB(1), ord%PERITAB(1), ord%CBLKNBR,
2652 & ord%RANGTAB(1),ord%TREETAB(1), IERR)
2658 CALL MUMPS_PROPINFO( id%ICNTL(1), id%INFO(1),
2659 & ord%COMM_NODES, id%MYID )
2660.LT.
IF ( id%INFO(1) 0 ) GOTO 10
2661.EQ.
IF(MYWORKID 0) THEN
2662 CALL SCOTCHFDGRAPHORDERGATHER(GRAPHDAT, ORDEDAT,
2668 CALL SCOTCHFDGRAPHORDERGATHER(GRAPHDAT, ORDEDAT,
2674 CALL MUMPS_PROPINFO( id%ICNTL(1), id%INFO(1),
2675 & ord%COMM_NODES, id%MYID )
2676.LT.
IF ( id%INFO(1) 0 ) GOTO 10
2677 CALL SCOTCHFDGRAPHORDEREXIT(GRAPHDAT, ORDEDAT)
2678 CALL SCOTCHFSTRATEXIT(STRADAT)
2679 CALL SCOTCHFDGRAPHEXIT(GRAPHDAT)
2681.NE.
IF (id%KEEP(10)1) THEN
2682 CALL MUMPS_I8DEALLOC(EDGELOCTAB_I8, MEMCNT=MEMCNT)
2683.EQ.
IF(MYWORKID 0) THEN
2684 CALL SCOTCHFDGRAPHCORDEREXIT(GRAPHDAT, CORDEDAT)
2685 CALL MUMPS_ICOPY_64TO32(PERMTAB_I8(1),
2686 & size(ord%PERMTAB), ord%PERMTAB(1))
2687 CALL MUMPS_ICOPY_64TO32(PERITAB_I8(1),
2688 & size(ord%PERITAB), ord%PERITAB(1))
2689 CALL MUMPS_ICOPY_64TO32(TREETAB_I8(1),
2690 & size(ord%TREETAB), ord%TREETAB(1))
2691 CALL MUMPS_ICOPY_64TO32(RANGTAB_I8(1),
2692 & size(ord%RANGTAB), ord%RANGTAB(1))
2693 ord%CBLKNBR = int(CBLKNBR_I8)
2694 CALL MUMPS_I8DEALLOC(PERMTAB_I8, MEMCNT=MEMCNT)
2695 CALL MUMPS_I8DEALLOC(PERITAB_I8, MEMCNT=MEMCNT)
2696 CALL MUMPS_I8DEALLOC(RANGTAB_I8, MEMCNT=MEMCNT)
2697 CALL MUMPS_I8DEALLOC(TREETAB_I8, MEMCNT=MEMCNT)
2701 END SUBROUTINE MUMPS_PTSCOTCH_MIXEDto64
subroutine mumps_symqamd_new(job, thresh, ndense, n, iwlen, pe, pfree, len, iw, nv, elen, last, ncmpa, degree, head, next, w, perm, complem_list, size_complem_list, agg6)
subroutine mumps_propinfo(icntl, info, comm, id)
subroutine cmumps_set_k821_surface(keep821, keep2, keep48, keep50, nslaves)
subroutine cmumps_cutnodes(n, frere, fils, nfsiz, sizeofblocks, lsizeofblocks, nsteps, nslaves, keep, keep8, splitroot, mp, ldiag, info1, info2)
subroutine cmumps_ana_m(ne, nd, nsteps, maxfr, maxelim, k50, sizefac_tot, maxnpiv, k5, k6, panel_size, k253)
subroutine cmumps_ana_lnew(n, ipe, nv, ips, ne, na, nfsiz, node, nsteps, fils, frere, nd, nemin, subord, keep60, keep20, keep38, namalg, namalgmax, cumul, keep50, icntl13, keep37, keep197, nslaves, allow_amalg_tiny_nodes, blkon, sizeofblocks, lsizeofblocks)
subroutine mpi_recv(buf, cnt, datatype, source, tag, comm, status, ierr)
subroutine mpi_reduce(sendbuf, recvbuf, cnt, datatype, op, root, comm, ierr)
subroutine mpi_comm_split(comm, color, key, comm2, ierr)
subroutine mpi_send(buf, cnt, datatype, dest, tag, comm, ierr)
subroutine mpi_barrier(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)
subroutine cmumps_get_subtrees(ord, id)
subroutine cmumps_make_loc_idx(id, topnodes, lperm, liperm, ord)
integer function cmumps_cnt_kids(node, ord)
logical function cmumps_stop_descent(id, ord, nactive, anode, rproc, alist, list, peakmem, nnodes, checkmem)
subroutine cmumps_mergesort(n, k, l)
subroutine cmumps_parsymfact(id, ord, gpe, gnv, work)
subroutine cmumps_assemble_top_graph(id, nlocvars, lperm, top_graph, ncliques, lstvar, lvarpt, ipe, pe, leng, elen)
subroutine cmumps_set_par_ord(id, ord)
subroutine cmumps_do_par_ord(id, ord, work)
subroutine cmumps_build_loc_graph(id, ord, gsize, ipe, pe, leng, i_halo_map, top_graph, work)
subroutine cmumps_mergeswap(n, l, a1, a2)
subroutine mumps_i8realloc(array, minsize, info, lp, force, copy, string, memcnt, errcode)
subroutine mumps_idealloc(a1, a2, a3, a4, a5, a6, a7, memcnt)
subroutine mumps_i8dealloc(a1, a2, a3, a4, a5, a6, a7, memcnt)
subroutine mumps_irealloc8(array, minsize, info, lp, force, copy, string, memcnt, errcode)