23 SUBROUTINE get_cut(IWR, NASS, NCB, LRGROUPS, NPARTSCB,
25 INTEGER,
INTENT(IN) :: NASS, NCB
26 INTEGER,
INTENT(IN) :: (*)
27 INTEGER,
INTENT(IN),
DIMENSION(:) :: LRGROUPS
28 INTEGER,
INTENT(OUT) :: NPARTSCB, NPARTSASS
29 INTEGER,
POINTER,
DIMENSION(:) :: CUT
30 INTEGER :: I, CURRENT_PART, CUTBUILDER,allocok
31 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: BIG_CUT
32 ALLOCATE(big_cut(
max(nass,1)+ncb+1),stat=allocok)
34 write(*,*)
"Allocation error of BIG_CUT in GET_CUT"
37 current_part = lrgroups(iwr(1))
44 IF (lrgroups(iwr(i)) == current_part)
THEN
45 big_cut(cutbuilder) = big_cut(cutbuilder) + 1
47 cutbuilder = cutbuilder + 1
48 big_cut(cutbuilder) = big_cut(cutbuilder-1) + 1
49 current_part = lrgroups(iwr(i))
51 IF (i == nass) npartsass = cutbuilder - 1
53 IF (nass.EQ.1) npartsass= 1
54 npartscb = cutbuilder - 1 - npartsass
55 ALLOCATE(cut(
max(npartsass,1)+npartscb+1),stat=allocok)
57 write(*,*)
"Allocation error of CUT in GET_CUT"
60 IF (npartsass.EQ.0)
THEN
62 cut(2:2+npartscb) = big_cut(1:1+npartscb)
64 cut = big_cut(1:npartsass+npartscb+1)
66 if(
allocated(big_cut))
DEALLOCATE(big_cut)
69 & LW, IPE, LEN, GROUP_SIZE, HALO_DEPTH, TRACE, WORKH, NODE,
70 & GEN2HALO, K482, K472, K469, SEP_SIZE, MAXSIZE_PARTS,
71 & KEEP10, LP, LPOK, IFLAG, IERROR)
72 INTEGER(8),
INTENT(IN) :: NZ, LW
73 INTEGER,
INTENT(IN) :: NV, N, GROUP_SIZE, HALO_DEPTH
74 INTEGER,
INTENT(IN) :: IW(LW), LEN(N), NODE, K482
75 INTEGER(8),
INTENT(IN) :: IPE(N+1)
76 INTEGER,
INTENT(IN) :: K472, K469, SEP_SIZE, KEEP10, LP
78 INTEGER,
INTENT(INOUT) :: NBGROUPS, WORKH(N)
79 INTEGER,
INTENT(INOUT) :: VLIST(NV), TRACE(N)
80 INTEGER :: LRGROUPS(:)
81 INTEGER,
INTENT(INOUT) :: GEN2HALO(N)
82 INTEGER,
INTENT(INOUT) :: IFLAG, IERROR
83 INTEGER,
INTENT(INOUT) :: MAXSIZE_PARTS
84 INTEGER(8),
ALLOCATABLE,
DIMENSION(:) :: IPTRHALO
85 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: PARTS, JCNHALO
86 INTEGER(8) :: HALOEDGENBR
88 & nbgroups_kway, i, group_size2, lrgroups_sign, ierr
89 INTEGER :: MAXSIZE_PARTS_LOC
90#if defined (metis) || defined (parmetis) || defined (metis4) || defined (parmetis3)
91 INTEGER :: METIS_IDX_SIZE
93#if defined (scotch) || defined (ptscotch)
94 INTEGER :: SCOTCH_IDX_SIZE
98 & int(real(nv+group_size2-1)/real(group_size2))
100 IF (nv .GE. sep_size)
THEN
105 IF (nbgroups_kway > 1)
THEN
108 CALL gethalonodes(n, iw, lw, ipe, vlist, nv, halo_depth,
109 & nhalo, trace, workh, node, len, haloedgenbr,
111 ALLOCATE(parts(nhalo), iptrhalo(nhalo+1),
112 & jcnhalo(haloedgenbr), stat=ierr)
114 IF (lpok)
WRITE(lp,*)
115 &
" Error allocate integer array of size: ",
116 & int(nhalo+(keep10*(nhalo+1)),8) + haloedgenbr
119 & (int(nhalo+(keep10*(nhalo+1)),8) + haloedgenbr,
122 CALL gethalograph(workh, nhalo, n, iw, lw, ipe, iptrhalo,
123 & jcnhalo, haloedgenbr,trace,node, gen2halo)
125 IF (iflag.LT.0)
RETURN
127 CALL gethalonodes(n, iw, lw, ipe, vlist, nv, halo_depth,
128 & nhalo, trace, workh, node, len, haloedgenbr,
130 ALLOCATE(parts(nhalo), iptrhalo(nhalo+1),
131 & jcnhalo(haloedgenbr), stat=ierr)
133 IF (lpok)
WRITE(lp,*)
134 &
" Error allocate integer array of size: ",
135 & int(nhalo+(keep10*(nhalo+1)),8) + haloedgenbr
138 & (int(nhalo+(keep10*(nhalo+1)),8) + haloedgenbr,
142 CALL gethalograph(workh, nhalo, n, iw, lw, ipe, iptrhalo,
143 & jcnhalo, haloedgenbr,trace,node, gen2halo)
146#if defined (metis) || defined (parmetis) || defined (metis4) || defined (parmetis3)
147 CALL mumps_metis_idxsize(metis_idx_size)
148 IF (metis_idx_size .EQ. 64)
THEN
149 CALL mumps_metis_kway_mixedto64(nhalo, haloedgenbr,
152 & nbgroups_kway, parts, lp, lpok, keep10,
155 IF (keep10.EQ.1)
THEN
159 CALL mumps_metis_kway_mixedto32(nhalo, haloedgenbr,
162 & nbgroups_kway, parts, lp, lpok, keep10,
167 ELSE IF (k482.EQ.2)
THEN
168#if defined (scotch) || defined (ptscotch)
169 CALL mumps_scotch_intsize(scotch_idx_size)
170 IF (scotch_idx_size .EQ. 32)
THEN
171 IF (keep10.EQ.1)
THEN
175 CALL mumps_scotch_kway_mixedto32(
176 & nhalo, haloedgenbr, iptrhalo, jcnhalo
177 & nbgroups_kway, parts, lp, lpok, keep10,
181 CALL mumps_scotch_kway_mixedto64(
182 & nhalo, haloedgenbr, iptrhalo, jcnhalo,
183 & nbgroups_kway, parts, lp, lpok, keep10,
188 WRITE(6,*)
" Internal ERROR K482=", k482
191 IF (iflag.LT.0)
GOTO 500
193 & nbgroups_kway, lrgroups, n, nbgroups, lrgroups_sign,
195 maxsize_parts =
max(maxsize_parts, maxsize_parts_loc)
197 maxsize_parts =
max(maxsize_parts,nv)
200 lrgroups(vlist(i)) = lrgroups_sign*(nbgroups + 1)
202 nbgroups = nbgroups + 1
205 500
IF (
allocated(iptrhalo))
then
208 IF (
allocated(parts))
then
211 IF (
allocated(jcnhalo))
then
217 & VLIST, N, LRGROUPS, NBGROUPS, LUMAT, SIZEOFBLOCKS,
218 & GROUP_SIZE, HALO_DEPTH, TRACE, WORKH, NODE,
219 & GEN2HALO, K482, K472, K469, SEP_SIZE, MAXSIZE_PARTS,
220 & KEEP10, LP, LPOK, IFLAG, IERROR)
222 INTEGER,
INTENT(IN) :: NV, NVEXPANDED,
223 & n, group_size, halo_depth
225INTEGER,
INTENT(IN) :: NODE, K482
226 INTEGER,
INTENT(IN) :: K472, K469, SEP_SIZE, KEEP10, LP
228 INTEGER,
INTENT(INOUT) :: NBGROUPS, WORKH(N)
229 INTEGER,
INTENT(INOUT) :: VLIST(NV), TRACE(N)
230 INTEGER :: LRGROUPS(:)
231 INTEGER,
INTENT(INOUT) :: GEN2HALO(N)
232 INTEGER,
INTENT(INOUT) :: IFLAG, IERROR
233 INTEGER,
INTENT(INOUT) :: MAXSIZE_PARTS
234 INTEGER(8),
ALLOCATABLE,
DIMENSION(:) :: IPTRHALO
235 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: PARTS, JCNHALO
236 INTEGER,
ALLOCATABLE,
DIMENSION(:)
237INTEGER(8) :: HALOEDGENBR
239 & nbgroups_kway, i, group_size2, lrgroups_sign, ierr
240 INTEGER :: MAXSIZE_PARTS_LOC
241 REAL :: COMPRESS_RATIO
242#if defined (metis) || defined (parmetis) || defined (metis4) || defined (parmetis3)
243 INTEGER :: METIS_IDX_SIZE
245#if defined (scotch) || defined (ptscotch)
246 INTEGER :: SCOTCH_IDX_SIZE
249 compress_ratio= real(nvexpanded)/real(nv)
251 & int(real(nvexpanded+group_size2-1)/real(group_size2))
253 nbgroups_kway =
min(nbgroups_kway, nv)
254 IF (nvexpanded .GE. sep_size)
THEN
259 IF (nbgroups_kway > 1)
THEN
263 & nhalo, trace, workh, node, haloedgenbr,
265 ALLOCATE(parts(nhalo), iptrhalo(nhalo+1),
266 & jcnhalo(haloedgenbr), vwgt(nhalo), stat=ierr)
268 IF (lpok)
WRITE(lp,*)
269 &
" Error allocate integer array of size: ",
270 & int(2*nhalo+(keep10*(nhalo+1)),8) + haloedgenbr
273 & (int(2*nhalo+(keep10*(nhalo+1)),8) + haloedgenbr,
277 vwgt(i) = sizeofblocks(workh(i))
280 & nhalo, n, lumat, iptrhalo,
281 & jcnhalo, haloedgenbr,trace,node, gen2halo, parts)
283 IF (iflag.LT.0)
RETURN
286 & nhalo, trace, workh, node, haloedgenbr,
288 ALLOCATE(parts(nhalo), iptrhalo(nhalo+1),
289 & jcnhalo(haloedgenbr), vwgt(nhalo), stat=ierr)
291 IF (lpok)
WRITE(lp,*)
292 &
" Error allocate integer array of size: ",
293 & int(2*nhalo+(keep10*(nhalo+1)),8) + haloedgenbr
296 & (int(2*nhalo+(keep10*(nhalo+1)),8) + haloedgenbr,
301 vwgt(i) = sizeofblocks(workh(i))
304 & nhalo, n, lumat, iptrhalo,
305 & jcnhalo, haloedgenbr,trace,node, gen2halo, parts)
308#if defined (metis) || defined (parmetis) || defined (metis4) || defined (parmetis3)
309 CALL mumps_metis_idxsize(metis_idx_size)
310 IF (metis_idx_size .EQ. 64)
THEN
311 CALL mumps_metis_kway_ab_mixedto64(nhalo, haloedgenbr,
314 & nbgroups_kway, parts, vwgt, lp, lpok, keep10,
317 IF (keep10.EQ.1)
THEN
321 CALL mumps_metis_kway_ab_mixedto32(nhalo, haloedgenbr,
324 & nbgroups_kway, parts, vwgt, lp, lpok, keep10,
329 ELSE IF (k482.EQ.2)
THEN
330#if defined (scotch) || defined (ptscotch)
331 CALL mumps_scotch_intsize(scotch_idx_size)
332 IF (scotch_idx_size .EQ. 32)
THEN
333 IF (keep10.EQ.1)
THEN
337 CALL mumps_scotch_kway_mixedto32(
338 & nhalo, haloedgenbr, iptrhalo, jcnhalo,
339 & nbgroups_kway, parts, lp, lpok, keep10,
343 CALL mumps_scotch_kway_mixedto64(
344 & nhalo, haloedgenbr, iptrhalo, jcnhalo,
345 & nbgroups_kway, parts, lp, lpok, keep10,
350 WRITE(6,*)
" Internal ERROR K482=", k482
353 IF (iflag.LT.0)
GOTO 500
355 & nbgroups_kway, lrgroups, n, nbgroups, lrgroups_sign,
357 maxsize_parts =
max( maxsize_parts,
358 & int(real(maxsize_parts_loc*compress_ratio)) )
360 maxsize_parts =
max(maxsize_parts,nv)
363 lrgroups(vlist(i)) = lrgroups_sign*(nbgroups + 1)
365 nbgroups = nbgroups + 1
368 500
IF (
allocated(iptrhalo))
then
371 IF (
allocated(parts))
then
374 IF (
allocated(jcnhalo))
then
377 IF (
allocated(vwgt))
then
383 & NHALO, TRACE, WORKH, NODE, HALOEDGENBR,
386 INTEGER,
DIMENSION(:),
INTENT(IN) :: IND
387 INTEGER,
INTENT(IN) :: N, NODE
388 INTEGER,
INTENT(IN) :: ,NIND
389 INTEGER,
INTENT(OUT) :: NHALO
390 INTEGER,
INTENT(INOUT) :: TRACE(N), WORKH(N)
391 INTEGER :: GEN2HALO(N)
392 INTEGER(8),
INTENT(OUT) :: HALOEDGENBR
394 INTEGER :: HALOI, NB, NEWNHALO
395 INTEGER(8) :: SEPEDGES_TOTAL,
402 sepedges_internal = 0_8
406 IF (trace(haloi) .NE. node)
THEN
412 nb = lumat%COL(haloi)%NBINCOL
413 sepedges_total = sepedges_total + int(nb,8)
415 ii = lumat%COL(haloi)%IRN(j)
416 IF (trace(ii).NE.node)
THEN
417 newnhalo = newnhalo + 1
418 workh(nhalo+newnhalo) = ii
419 gen2halo(ii) = nhalo+newnhalo
422 IF (gen2halo(ii).LE.nhalo)
THEN
423 sepedges_internal = sepedges_internal + 1_8
428 haloedgenbr = sepedges_total +
429 & (sepedges_total - sepedges_internal)
430 nhalo = nhalo + newnhalo
433 & N,LUMAT,IPTRHALO,JCNHALO,
434 & HALOEDGENBR,TRACE,NODE, GEN2HALO, IQ)
435 INTEGER,
INTENT(IN) ::
437 INTEGER,
INTENT(IN):: NSEP, NHALO, NODE
438 INTEGER,
INTENT(IN):: GEN2HALO(N)
439 INTEGER,
DIMENSION(NHALO),
INTENT(IN) :: HALO
440 INTEGER,
INTENT(IN) :: TRACE(N)
441 INTEGER(8),
INTENT(IN) :: HALOEDGENBR
442 INTEGER(8),
INTENT(OUT) :: IPTRHALO(NHALO+1)
443 INTEGER,
INTENT(OUT) :: JCNHALO(HALOEDGENBR)
445 INTEGER::I,J,NB,II,JJ,HALOI,HALOJ
451 nb = lumat%COL(haloi)%NBINCOL
454 ii = lumat%COL(haloi)%IRN(jj)
463 iptrhalo(i+1) = iptrhalo(i)+int(iq(i),8)
467 nb = lumat%COL(haloi)%NBINCOL
469 haloj = lumat%COL(haloi)%IRN(jj)
471 jcnhalo(iptrhalo(i)) = j
472 iptrhalo(i) = iptrhalo(i) + 1
474 jcnhalo(iptrhalo(j)) = i
475 iptrhalo(j) = iptrhalo(j) + 1
481 iptrhalo(i+1) = iptrhalo(i)+int(iq(i),8)
485 & LRGROUPS, N, NBGROUPS, LRGROUPS_SIGN,
487 INTEGER,
INTENT(IN) :: NSEP, N, LRGROUPS_SIGN
489 INTEGER,
DIMENSION(:),
INTENT(INOUT) :: SEP
490 INTEGER,
INTENT(INOUT) :: NPARTS
491 INTEGER,
INTENT(INOUT) :: NBGROUPS
492 INTEGER :: LRGROUPS(:)
493 INTEGER,
INTENT(OUT) :: MAXSIZE_PARTS_LOC
495 INTEGER:: I,CNT,NB_PARTS_WITHOUT_SEP_NODE,allocok
496 INTEGER:: TARGET_SIZE_KWAY
497 INTEGER:: MAXSIZE_PARTS_LOC_NEW
498 INTEGER,
DIMENSION(:),
ALLOCATABLE::SIZES, RIGHTPART
499 INTEGER,
DIMENSION(:),
ALLOCATABLE::PARTPTR
501 INTEGER :: NB_PARTS_WITH_SPLIT, IP, SZ_FINAL, II, NB_SPLIT
502 INTEGER :: TARGET_SIZE_SPLIT
504 INTEGER,
DIMENSION(:),
ALLOCATABLE :: NEWSEP
505 ALLOCATE( newsep(nsep),
508 & partptr(nparts+1),stat=allocok)
509 IF(allocok.GT.0)
THEN
510 write(*,*)
"Allocation error in GET_GLOBAL_GROUPS"
513 target_size_kway = (nsep+nparts-1) / nparts
514 target_size_split = 2*target_size_kway
515 nb_parts_without_sep_node = 0
519 sizes(parts(i)) = sizes(parts(i)) + 1
521 maxsize_parts_loc = maxval(sizes)
525 partptr(i) = partptr(i-1) + sizes(i-1)
526 IF (sizes(i-1)==0)
THEN
527 nb_parts_without_sep_node = nb_parts_without_sep_node + 1
531#if ! defined(NO_SPLIT_IN_BLRGROUPING)
532 sizes(cnt) = sizes(i-1)
536 nparts = nparts - nb_parts_without_sep_node
537#if ! defined(NO_SPLIT_IN_BLRGROUPING)
538 IF (maxsize_parts_loc.LT.target_size_split)
THEN
542 newsep(partptr(parts(i))) = sep(i)
543 lrgroups(sep(i)) = lrgroups_sign*(rightpart(parts(i))
546 & partptr(parts(i)) + 1
548 nbgroups = nbgroups + nparts
551#if ! defined(NO_SPLIT_IN_BLRGROUPING)
554 newsep(partptr(parts(i))) = sep(i)
556 & partptr(parts(i)) + 1
561 partptr(i) = partptr(i-1) + sizes(i-1)
563 nb_parts_with_split = 0
564 maxsize_parts_loc_new = 0
567 nb_split = (sizes(ip) + target_size_split-1)
568 & / target_size_split
569 sz_final = (sizes(ip) + nb_split-1) / nb_split
570 maxsize_parts_loc_new =
max(maxsize_parts_loc_new,
572 DO i=partptr(ip), partptr(ip+1)-1, sz_final
573 nb_parts_with_split = nb_parts_with_split +1
574 DO ii=i,
min(i+sz_final-1,partptr(ip+1)-1)
575 lrgroups(sep(ii)) = lrgroups_sign*(nb_parts_with_split
580 nbgroups = nbgroups + nb_parts_with_split
582 nparts = nb_parts_with_split
583 maxsize_parts_loc = maxsize_parts_loc_new
586 DEALLOCATE(newsep,sizes,rightpart,partptr)
589 & NHALO, TRACE, WORKH, NODE, LEN, CNT,
591 INTEGER,
DIMENSION(:),
INTENT(IN) :: IND
592 INTEGER(8),
INTENT(IN) :: LW
593 INTEGER,
INTENT(IN) :: N, NODE
594 INTEGER,
INTENT(IN) :: IW(LW), LEN(N)
595 INTEGER(8),
INTENT(IN) :: IPE(N+1)
596 INTEGER,
INTENT(IN) :: PMAX,NIND
597 INTEGER,
INTENT(OUT) :: NHALO
598 INTEGER,
INTENT(INOUT) :: TRACE(N), WORKH(N)
599 INTEGER :: GEN2HALO(N)
600 INTEGER(8),
INTENT(OUT) :: CNT
601 INTEGER :: DEPTH, I, LAST_LVL_START
611 IF (trace(haloi) .NE. node)
THEN
614 DO j=ipe(haloi),ipe(haloi+1)-1
615 IF (trace(iw(j)).EQ.node)
THEN
622 & trace, node, len, cnt, last_lvl_start,
623 & depth, pmax, gen2halo)
627 & TRACE, NODE, LEN, CNT, LAST_LVL_START,
628 & DEPTH, PMAX, GEN2HALO)
629 INTEGER,
INTENT(IN) :: N, NODE, DEPTH
630INTEGER,
INTENT(INOUT) :: NHALO, GEN2HALO(N)
631 INTEGER,
INTENT(INOUT) :: LAST_LVL_START
632 INTEGER(8),
INTENT(INOUT) :: CNT
633 INTEGER,
DIMENSION(:),
INTENT(INOUT) :: HALO
634 INTEGER(8),
INTENT(IN) :: LW
635 INTEGER(8),
INTENT(IN) :: IPE(N+1)
636 INTEGER,
TARGET,
INTENT(IN) :: IW(LW)
637 INTEGER,
INTENT(IN) :: LEN(N)
638 INTEGER,
DIMENSION(:) :: TRACE
639 INTEGER :: AvgDens, THRESH
640 INTEGER :: I,INEI,NADJI,NEWNHALO, NEIGH
641 INTEGER,
DIMENSION(:),
POINTER :: ADJI
644 avgdens = nint(real(ipe(n+1)-1_8)/real(n))
646 DO i=last_lvl_start,nhalo
648 IF (nadji.GT.thresh) cycle
649 adji => iw(ipe(halo(i)):ipe(halo(i)+1)-1)
651 IF (trace(adji(inei)) .NE. node)
THEN
653 IF (len(neigh).GT.thresh) cycle
655 newnhalo = newnhalo + 1
656 halo(nhalo+newnhalo) = neigh
657 gen2halo(neigh) = nhalo + newnhalo
658 DO j=ipe(neigh),ipe(neigh+1)-1
659 IF (trace(iw(j)).EQ.node)
THEN
666 last_lvl_start = nhalo + 1
667 nhalo = nhalo + newnhalo
670 & HALOEDGENBR,TRACE,NODE, GEN2HALO)
671 INTEGER,
INTENT(IN) :: N
672 INTEGER,
INTENT(IN):: , NODE
673 INTEGER,
INTENT(IN):: GEN2HALO(N)
674 INTEGER,
DIMENSION(NHALO),
INTENT(IN) :: HALO
675 INTEGER(8),
INTENT(IN) :: LW
676 INTEGER(8),
INTENT(IN) :: IPE(N+1)
677 INTEGER,
INTENT(IN) :: IW(LW), TRACE(N)
678 INTEGER(8),
INTENT(IN) :: HALOEDGENBR
679 INTEGER(8),
INTENT(OUT) :: IPTRHALO(NHALO+1)
680 INTEGER,
INTENT(OUT) :: JCNHALO(HALOEDGENBR)
681 INTEGER::I,IPTR_CNT,JCN_CNT,HALOI
689 DO j=ipe(haloi),ipe(haloi+1)-1
690 IF (trace(iw(j))==node)
THEN
692 jcnhalo(jcn_cnt) = gen2halo(iw(j))
693 jcn_cnt = jcn_cnt + 1
696 iptrhalo(iptr_cnt) = cnt + 1
697 iptr_cnt = iptr_cnt + 1
701 & CUT,NEWSEP,PERM,IPERM)
702 INTEGER,
INTENT(IN) :: NHALO,NSEP
703 INTEGER,
DIMENSION(:),
INTENT(IN) :: SEP
704 INTEGER,
POINTER,
DIMENSION(:)::PARTS
705 INTEGER,
POINTER,
DIMENSION(:)::CUT,NEWSEP,PERM,
707 INTEGER,
INTENT(INOUT) :: NPARTS
708 INTEGER::I,CNT,NB_PARTS_WITHOUT_SEP_NODE,allocok
709 INTEGER,
DIMENSION(:),
ALLOCATABLE::SIZES
710 INTEGER,
DIMENSION(:),
ALLOCATABLE::PARTPTR
711 ALLOCATE(newsep(nsep),stat=allocok)
712 IF(allocok.GT.0)
THEN
713 write(*,*)
"Allocation error in GET_GROUPS"
716 ALLOCATE(perm(nsep),stat=allocok)
717 IF(allocok.GT.0)
THEN
718 write(*,*)
"Allocation error in GET_GROUPS"
721 ALLOCATE(iperm(nsep),stat=allocok)
722 IF(allocok.GT.0)
THEN
723 write(*,*)
"Allocation error in GET_GROUPS"
726 ALLOCATE(sizes(nparts),stat=allocok)
727 IF(allocok.GT.0)
THEN
728 write(*,*)
"Allocation error in GET_GROUPS"
731 ALLOCATE(partptr(nparts+1),stat=allocok)
732 IF(allocok.GT.0)
THEN
733 write(*,*)
"Allocation error in GET_GROUPS"
736 nb_parts_without_sep_node = 0
744 partptr(i) = partptr(i-1) + sizes(i-1)
745 IF (sizes(i-1)==0)
THEN
746 nb_parts_without_sep_node = nb_parts_without_sep_node + 1
749 ALLOCATE(cut(nparts-nb_parts_without_sep_node+1),stat=allocok)
750 IF(allocok.GT.0)
THEN
751 write(*,*)
"Allocation error in GET_GROUPS"
757 IF (sizes(i-1).NE.0)
THEN
758 cut(cnt) = partptr(i)
762 nparts = nparts - nb_parts_without_sep_node
763 cut(nparts+1) = nsep+1
765 newsep(partptr(parts(i))) = sep(i)
766 perm(partptr(parts(i))) = i
767 iperm(i) = partptr(parts(i))
769 & partptr(parts(i)) + 1
771 DEALLOCATE(sizes,partptr)
774 & FRERE_STEPS, DAD_STEPS, NE_STEPS, STEP, NA, LNA,
775 & LRGROUPS, SYM, ICNTL, HALO_DEPTH, GROUP_SIZE, SEP_SIZE,
777 & IFLAG, IERROR, K264, K265, K482, K472, MAXFRONT, K10,
778 & K54, K142, LPOK, LP, GATHER_MATRIX_ALLOCATED)
780 INTEGER,
INTENT(IN) :: N, NSTEPS, LNA, SYM,
781 & halo_depth, sep_size, group_size
782 INTEGER(8),
INTENT(IN) :: NZ8
783 INTEGER,
INTENT(INOUT) :: IFLAG, IERROR
784 INTEGER,
INTENT(INOUT) :: K38, K20, K264, K265
785 INTEGER,
INTENT(IN) :: K482, K10, K60, K54
786 INTEGER,
INTENT(IN) :: LP
787 INTEGER,
INTENT(OUT) ::
788 LOGICAL,
INTENT(IN) :: LPOK
789 INTEGER,
POINTER,
DIMENSION(:) :: IRN, JCN
790 INTEGER,
INTENT(IN) :: NE_STEPS(:), ICNTL(60)
791 INTEGER :: FILS(:), FRERE_STEPS(:), STEP(:),
792 & na(:), dad_steps(:), lrgroups(:)
793 INTEGER,
INTENT(IN) :: K472, MAXFRONT
794 LOGICAL,
INTENT(INOUT) :: GATHER_MATRIX_ALLOCATED
795 INTEGER :: K482_LOC, K38ou20
796 INTEGER :: I, F, PV, NV, NLEAVES, NROOTS, PP, C, NF, NODE,
798 INTEGER(8) :: LW, IWFR, NRORM, NIORM
799 INTEGER :: LPTR, , NBGROUPS
801 INTEGER,
ALLOCATABLE,
DIMENSION (:) :: POOL, PVS, WORK
802 INTEGER,
ALLOCATABLE,
DIMENSION (:) :: LEN, IW
803 INTEGER(8),
ALLOCATABLE,
DIMENSION (:) :: IPE, IQ
804 INTEGER,
ALLOCATABLE,
DIMENSION (:) :: TRACE, WORKH, GEN2HALO
805 INTEGER :: STEP_SCALAPACK_ROOT
806 INTEGER :: GROUP_SIZE2, IERR
807 LOGICAL :: INPLACE64_GRAPH_COPY
809 IF (k38ou20.GT.0)
THEN
810 step_scalapack_root = step(k38ou20)
812 step_scalapack_root = 0
814 IF((k482.LE.0) .OR. (k482.GT.3))
THEN
815#if defined(parmetis) || defined(metis) || defined(parmetis3) || defined(metis4)
817#elif defined(ptscotch) || defined(scotch)
822 ELSE IF (k482.EQ.1)
THEN
823#if !defined(parmetis) && !defined(metis) && !defined(parmetis3) && !defined(metis4)
824#if defined(ptscotch) || defined(scotch)
832 ELSE IF (k482.EQ.2)
THEN
833#if !defined(ptscotch) && !defined(scotch)
834#if defined(parmetis) || defined(metis) || defined(parmetis3) || defined(metis4)
842 ELSE IF (k482.EQ.3)
THEN
851 ALLOCATE(iw(lw), ipe(n+1), len(n), iq(n),
852 & pool(na(1)), pvs(nsteps),
855 IF (lpok)
WRITE(lp,*)
" Error allocate integer array of size: ",
856 * lw+int(n,8)+int(k10*(2*n+1),8)
862 & len(1), iq(1), lrgroups(1), iwfr, nrorm, niorm,
864 & icntl(1) , symtry, sym, nbqd, ad, k264, k265,.false.,
865 & inplace64_graph_copy)
871 gather_matrix_allocated = .false.
873 IF (
allocated(iq))
DEALLOCATE(iq)
878 rptr = 2+nleaves+nroots
880 pool(i) = na(2+nleaves+i)
883 ALLOCATE(work(maxfront), trace(n), workh(n), gen2halo(n),
886 IF (lpok)
WRITE(lp,*)
" Error allocate integer array of size: ",
889 ierror = 3*n+maxfront
897 first = pool(pp) .LT. 0
906 IF (nv .GE. group_size2)
THEN
909 & ( (k60.NE.0).AND.(work(1).EQ.k38ou20) )
913 lrgroups(work(i))=nbgroups+1+(i-1)/group_size2
915 nbgroups = nbgroups + (nv-1)/group_size2 + 1
918 & lrgroups, nbgroups, iw(1), lw, ipe(1), len(1),
919 & group_size, halo_depth, trace(1), workh(1), node,
920 & gen2halo(1), k482_loc, k472, 0, sep_size, k142,
921 & k10, lp, lpok, iflag, ierror)
922 IF (iflag.LT.0)
GOTO 500
925 IF (nv .GE. sep_size)
THEN
927 lrgroups( work(i) ) = (nbgroups + 1)
931 lrgroups( work(i) ) = -(nbgroups + 1)
934 nbgroups = nbgroups + 1
938 & fils, frere_steps, step, dad_steps,
939 & ne_steps, na, lna, pvs(1), k38ou20,
940 & step_scalapack_root)
941 IF (step_scalapack_root.GT.0)
THEN
963 500
IF (
allocated(pool))
DEALLOCATE(pool)
964 IF (
allocated(pvs))
DEALLOCATE(pvs)
965 IF (
allocated(work))
DEALLOCATE(work)
966 IF (
allocated(ipe))
DEALLOCATE(ipe)
967 IF (
allocated(len))
DEALLOCATE(len)
968 IF (
allocated(trace))
DEALLOCATE(trace)
969 IF (
allocated(workh))
DEALLOCATE(workh)
970 IF (
allocated(gen2halo))
DEALLOCATE(gen2halo)
974 & FRERE_STEPS, DAD_STEPS, STEP, NA, LNA, LRGROUPS,
975 & SYM, ICNTL, HALO_DEPTH, GROUP_SIZE, SEP_SIZE, K38, K20,
976 & K60, IFLAG, IERROR, K264, K265, K482, K472, MAXFRONT, K469,
977 & K10, K54, K142, LPOK, LP, GATHER_MATRIX_ALLOCATED)
979 INTEGER,
INTENT(IN) :: N, NSTEPS, LNA, SYM,
980 & halo_depth, sep_size, group_size
981 INTEGER(8),
INTENT(IN) :: NZ8
982 INTEGER,
INTENT(INOUT) :: IFLAG, IERROR
983 INTEGER,
INTENT(INOUT) :: K38, K20, K264, K265
984 INTEGER,
INTENT(IN) :: K482, K10, MAXFRONT, K60, K54
985 INTEGER,
INTENT(IN) :: LP
986 LOGICAL,
INTENT(IN) :: LPOK
987 INTEGER,
POINTER,
DIMENSION(:) :: , JCN
988 INTEGER,
INTENT(IN) :: ICNTL(60)
989 INTEGER,
POINTER :: FILS(:), FRERE_STEPS(:), STEP(:),
990 & na(:), dad_steps(:), lrgroups(:)
991 INTEGER,
INTENT(IN) :: K472, K469
992 LOGICAL,
INTENT(INOUT) :: GATHER_MATRIX_ALLOCATED
993 INTEGER,
INTENT(OUT) :: K142
994 INTEGER :: K482_LOC, K469_LOC, K38ou20
995 INTEGER :: I, F, PV, NV, NODE,
997 LOGICAL :: PVSCHANGED
998 INTEGER(8) :: LW, IWFR, NRORM, NIORM
999 INTEGER :: NBGROUPS, NBGROUPS_local
1000 INTEGER,
ALLOCATABLE,
DIMENSION (:) :: PVS, WORK
1001 INTEGER,
ALLOCATABLE,
DIMENSION (:) :: LEN, IW
1002 INTEGER(8),
ALLOCATABLE,
DIMENSION (:) :: IPE, IQ
1003 INTEGER,
ALLOCATABLE,
DIMENSION (:) :: TRACE, WORKH,
1005 INTEGER,
ALLOCATABLE,
DIMENSION (:) :: TRACE_PRV, WORKH_PRV,
1007 INTEGER :: STEP_SCALAPACK_ROOT
1008 INTEGER :: , IERR, OMP_NUM
1009 INTEGER :: IERR_PRIV
1010 LOGICAL :: INPLACE64_GRAPH_COPY
1011#
if defined(ptscotch) || defined(scotch)
1013 LOGICAL :: SCOTCH_IS_THREAD_SAFE
1014 INTEGER :: PTHREAD_NUMBER, NOMP
1016 k38ou20=
max(k38,k20)
1017 IF (k38ou20.GT.0)
THEN
1018 step_scalapack_root = step(k38ou20)
1020 step_scalapack_root = 0
1022 IF((k482.LE.0) .OR. (k482.GT.3))
THEN
1023#if defined(parmetis) || defined(metis) || defined(parmetis3) || defined(metis4)
1025#elif defined(ptscotch) || defined(scotch)
1030 ELSE IF (k482.EQ.1)
THEN
1031#if !defined(parmetis) && !defined(metis) && !defined(parmetis3) && !defined(metis4)
1032#if defined(ptscotch) || defined(scotch)
1040 ELSE IF (k482.EQ.2)
THEN
1041#if !defined(ptscotch) && !defined(scotch)
1042#if defined(parmetis) || defined(metis) || defined(parmetis3) || defined(metis4)
1050 ELSE IF (k482.EQ.3)
THEN
1054#if defined(ptscotch) || defined(scotch)
1055 scotch_is_thread_safe = .false.
1056 IF (k482_loc.EQ.2)
THEN
1057 CALL mumps_scotch_version (vscotch)
1058 IF (vscotch.GE.7) scotch_is_thread_safe=.true.
1060 IF (k482_loc.EQ.2.AND.(.NOT.scotch_is_thread_safe) )
THEN
1066 ALLOCATE(iw(lw), ipe(n+1), len(n), iq(n),
1070 IF (lpok)
WRITE(lp,*)
" Error allocate integer array of size: ",
1071 * lw+int(n,8)+int(k10*(2*n+1),8)
1077 & len(1), iq(1), lrgroups(1), iwfr, nrorm, niorm,
1079 & icntl(1) , symtry, sym, nbqd, ad, k264, k265,.false.,
1080 & inplace64_graph_copy)
1086 gather_matrix_allocated = .false.
1088 IF (
allocated(iq))
DEALLOCATE(iq)
1090 IF (k469_loc.NE.2)
THEN
1091 ALLOCATE(trace(n), workh(n), gen2halo(n),
1094 IF (lpok)
WRITE(lp,*)
" Error allocate integer array of ",
1101#if defined(ptscotch) || defined(scotch)
1102 IF (k482_loc.EQ.2)
THEN
1105 IF (nomp .GT. 0)
THEN
1106 CALL mumps_scotch_get_pthread_number (pthread_number)
1108 CALL mumps_scotch_set_pthread_number (nomp)
1113 pvschanged = .false.
1116 omp_num =
min(omp_num,8)
1122 ALLOCATE(work(maxfront), stat=ierr_priv)
1123 IF (ierr_priv.GT.0)
THEN
1124 IF (lpok)
WRITE(lp,*)
" Error allocate integer array of ",
1125 *
"size: ", maxfront
1133 IF (ierr_priv .EQ. 0 .AND. k469_loc.EQ.2)
THEN
1134 ALLOCATE(trace_prv(n), workh_prv(n), gen2halo_prv(n),
1136 IF (ierr_priv.GT.0)
THEN
1137 IF (lpok)
WRITE(lp,*)
" Error allocate integer array of ",
1148 IF (iflag .LT. 0 )
THEN
1151 IF (k469_loc.EQ.2)
THEN
1160 IF (step(i).GT.0) pvs(step(i)) = i
1165 IF (iflag.LT.0) cycle
1175 IF (nv .GE. group_size2)
THEN
1176 IF ( (k482_loc.EQ.3)
1178 & ( (k60.NE.0).AND.(work(1).EQ.k38ou20) )
1183 lrgroups(work(i))=nbgroups+1+(i-1)/group_size2
1185 nbgroups = nbgroups + (nv-1)/group_size2 + 1
1188 IF (k469_loc .EQ. 2)
THEN
1190 & lrgroups, nbgroups, iw(1), lw, ipe(1), len(1),
1191 & group_size, halo_depth, trace_prv, workh_prv,
1192 & node, gen2halo_prv, k482_loc, k472, k469_loc,
1193 & sep_size, k142, k10, lp, lpok, iflag, ierror)
1196 & lrgroups, nbgroups, iw(1), lw, ipe(1), len(1),
1197 & group_size, halo_depth, trace, workh,
1198 & node, gen2halo, k482_loc, k472, k469_loc,
1199 & sep_size, k142, k10, lp, lpok, iflag, ierror)
1201 IF (iflag.LT.0) cycle
1206 step(work(1)) = abs(step(work(1)))
1207 IF (step(work(1)).EQ.step_scalapack_root)
THEN
1215 step(work(i+1)) = -step(work(1))
1216 IF (fils(work(i)).LE.0)
THEN
1217 fils(work(nv)) = fils(work(i))
1219 fils(work(i)) = work(i+1)
1224 nbgroups = nbgroups + 1
1225 nbgroups_local = nbgroups
1227 IF (nv .GE. sep_size)
THEN
1229 lrgroups( work(i) ) = nbgroups_local
1233 lrgroups( work(i) ) = -nbgroups_local
1239 IF (iflag.LT.0)
GOTO 500
1240 IF (.NOT.pvschanged)
GOTO 500
1243 IF(frere_steps(node) .GT. 0)
THEN
1244 frere_steps(node) = pvs(abs(step(frere_steps(node))))
1245 ELSE IF(frere_steps(node) .LT. 0)
THEN
1246 frere_steps(node) = -pvs(abs(step(dad_steps(node))))
1248 IF(dad_steps(node) .NE. 0)
THEN
1249 dad_steps(node) = pvs(abs(step(dad_steps(node))))
1255 na(i) = pvs(abs(step(na(i))))
1260 IF (fils(i).LT.0)
THEN
1261 fils(i) = -pvs(abs(step(-fils(i))))
1266 IF (
allocated(work))
DEALLOCATE(work)
1267 IF (k469_loc.EQ.2)
THEN
1268 IF (
allocated(trace_prv))
DEALLOCATE(trace_prv)
1269 IF (
allocated(workh_prv))
DEALLOCATE(workh_prv)
1270 IF (
allocated(gen2halo_prv))
DEALLOCATE(gen2halo_prv)
1273#if defined(ptscotch) || defined(scotch)
1274 IF (k482_loc.EQ.2.AND.nomp .GT. 0)
THEN
1275 CALL mumps_scotch_set_pthread_number (pthread_number)
1279 IF (k469_loc.NE.2)
THEN
1280 IF (
allocated(trace))
DEALLOCATE(trace)
1281 IF (
allocated(workh))
DEALLOCATE(workh)
1282 IF (
allocated(gen2halo))
DEALLOCATE(gen2halo)
1284 IF (
allocated(pvs))
DEALLOCATE(pvs)
1285 IF (
allocated(ipe))
DEALLOCATE(ipe)
1286 IF (
allocated(len))
DEALLOCATE(len)
1290 & NSTEPS, LUMAT, FILS,
1291 & FRERE_STEPS, DAD_STEPS, STEP, NA, LNA, LRGROUPS,
1292 & SIZEOFBLOCKS, SYM, ICNTL, HALO_DEPTH, GROUP_SIZE,
1293 & SEP_SIZE, K38, K20,
1294 & K60, IFLAG, IERROR, K264, K265, K482, K472, MAXFRONT, K469,
1295 & K10, K54, K142, LPOK, LP, MYID, COMM)
1297 INTEGER,
INTENT(IN) :: MYID, COMM
1299 INTEGER,
INTENT(IN) :: N, NSTEPS, LNA, SYM,
1300 & halo_depth, sep_size, group_size
1301 INTEGER,
INTENT(IN) :: SIZEMAPCOL
1302 INTEGER,
INTENT(IN) :: MAPCOL(SIZEMAPCOL)
1303 INTEGER,
INTENT(INOUT) :: IFLAG, IERROR
1304 INTEGER,
INTENT(INOUT) :: K38, K20, K264, K265
1305 INTEGER,
INTENT(IN) :: K482, K10, , K60, K54
1306 INTEGER,
INTENT(IN) :: LP
1307 LOGICAL,
INTENT(IN) :: LPOK
1308 INTEGER,
INTENT(OUT) :: K142
1309 INTEGER,
INTENT(IN) :: ICNTL(60)
1310 INTEGER,
POINTER :: FILS(:), FRERE_STEPS(:), STEP(:),
1311 & na(:), dad_steps(:), lrgroups(:)
1312 INTEGER,
INTENT(IN) :: SIZEOFBLOCKS(N)
1313 INTEGER,
INTENT(IN) :: K472, K469
1314 INTEGER :: K482_LOC, K469_LOC, K38ou20
1315 INTEGER :: I, F, PV, NV, NVEXPANDED, NODE
1316 REAL :: COMPRESS_RATIO
1317 LOGICAL :: PVSCHANGED
1318 INTEGER :: NBGROUPS, NBGROUPS_local
1319 INTEGER,
ALLOCATABLE,
DIMENSION (:) :: PVS, WORK
1320 INTEGER,
ALLOCATABLE,
DIMENSION (:) :: TRACE, ,
1322 INTEGER,
ALLOCATABLE,
DIMENSION (:) :: TRACE_PRV, WORKH_PRV,
1324 INTEGER :: STEP_SCALAPACK_ROOT
1325 INTEGER :: GROUP_SIZE2, IERR,
1326 INTEGER :: IERR_PRIV
1327 LOGICAL :: MAPCOL_PROVIDED
1328#if defined(ptscotch) || defined(scotch)
1330 LOGICAL :: SCOTCH_IS_THREAD_SAFE
1331 INTEGER :: PTHREAD_NUMBER, NOMP
1333 mapcol_provided = (mapcol(1).GE.0)
1334 k38ou20=
max(k38,k20)
1335 IF (k38ou20.GT.0)
THEN
1336 step_scalapack_root = step(k38ou20)
1338 step_scalapack_root = 0
1340 IF((k482.LE.0) .OR. (k482.GT.3
THEN
1341#if defined(parmetis) || defined(metis) || defined(parmetis3) || defined(metis4)
1343#elif defined(ptscotch) || defined(scotch)
1348 ELSE IF (k482.EQ.1)
THEN
1349#if !defined(parmetis) && !defined(metis) && !defined(parmetis3) && !defined(metis4)
1350#if defined(ptscotch) || defined(scotch)
1358 ELSE IF (k482.EQ.2)
THEN
1359#if !defined(ptscotch) && !defined(scotch)
1360#
if defined(parmetis) || defined(metis) || defined(parmetis3) || defined(metis4)
1368 ELSE IF (k482.EQ.3)
THEN
1372#if defined(ptscotch) || defined(scotch)
1373 scotch_is_thread_safe = .false.
1374 IF (k482_loc.EQ.2)
THEN
1375 CALL mumps_scotch_version (vscotch)
1376 IF (vscotch.GE.7) scotch_is_thread_safe=.true.
1378 IF (k482_loc.EQ.2.AND.(.NOT.scotch_is_thread_safe) )
THEN
1383 ALLOCATE( pvs(nsteps), stat=ierr)
1387 IF (lpok)
WRITE(lp,*)
" Error allocate integer array of ",
1392 IF (k469_loc.NE.2)
THEN
1393 ALLOCATE(trace(n), workh(n), gen2halo(n),
1396 IF (lpok)
WRITE(lp,*)
" Error allocate integer array of ",
1403#if defined(ptscotch) || defined(scotch)
1404 IF (k482_loc.EQ.2)
THEN
1407 IF (nomp .GT. 0)
THEN
1408 CALL mumps_scotch_get_pthread_number (pthread_number)
1410 CALL mumps_scotch_set_pthread_number (nomp)
1415 pvschanged = .false.
1418 omp_num =
min(omp_num,8)
1425 ALLOCATE(work(maxfront), stat=ierr_priv)
1426 IF (ierr_priv.GT.0)
THEN
1427 IF (lpok)
WRITE(lp,*)
" Error allocate integer array of ",
1428 *
"size: ", maxfront
1437 ALLOCATE(trace_prv(n), workh_prv(n), gen2halo_prv(n),
1439 IF (ierr_priv.GT.0)
THEN
1440 IF (lpok)
WRITE(lp,*)
" Error allocate integer array of ",
1449 IF (iflag .LT. 0 )
THEN
1452 IF (k469_loc.EQ.2)
THEN
1461 IF (step(i).GT.0) pvs(step(i)) = i
1466 IF (iflag.LT.0) cycle
1467 IF (mapcol_provided)
THEN
1468 IF (mapcol(node).NE.myid)
THEN
1479 nvexpanded = nvexpanded+sizeofblocks(f)
1483 compress_ratio = real(nvexpanded)/real(nv)
1485 IF (nvexpanded .GE. group_size2)
THEN
1486 IF ( (k482_loc.EQ.3)
1488 & ( (k60.NE.0).AND.(work(1).EQ.k38ou20) )
1491 group_size2 =
max(int(real(group_size2)/compress_ratio), 1)
1494 lrgroups(work(i))=nbgroups+1+(i-1)/group_size2
1496 nbgroups = nbgroups + (nv-1)/group_size2 + 1
1499 IF (k469_loc .EQ. 2)
THEN
1501 & lrgroups, nbgroups, lumat, sizeofblocks,
1502 & group_size, halo_depth, trace_prv, workh_prv,
1503 & node, gen2halo_prv, k482_loc, k472, k469_loc,
1504 & sep_size, k142, k10, lp, lpok, iflag, ierror)
1507 & lrgroups, nbgroups, lumat, sizeofblocks,
1508 & group_size, halo_depth, trace, workh,
1509 & node, gen2halo, k482_loc, k472, k469_loc,
1510 & sep_size, k142, k10, lp, lpok, iflag, ierror)
1512 IF (iflag.LT.0) cycle
1517 step(work(1)) = abs(step(work(1)))
1518 IF (step(work(1)).EQ.step_scalapack_root)
THEN
1526 step(work(i+1)) = -step(work(1))
1527 IF (fils(work(i)).LE.0)
THEN
1528 fils(work(nv)) = fils(work
1530 fils(work(i)) = work(i+1)
1535 nbgroups = nbgroups + 1
1536 nbgroups_local = nbgroups
1538 IF (nvexpanded .GE. sep_size)
THEN
1540 lrgroups( work(i) ) = nbgroups_local
1544 lrgroups( work(i) ) = -nbgroups_local
1550 IF (iflag.LT.0)
GOTO 500
1551 IF (.NOT.pvschanged)
GOTO 500
1554 IF(frere_steps(node) .GT. 0)
THEN
1555 frere_steps(node) = pvs(abs(step(frere_steps(node))))
1556 ELSE IF(frere_steps(node) .LT. 0)
THEN
1557 frere_steps(node) = -pvs(abs(step(dad_steps(node))))
1559 IF(dad_steps(node) .NE. 0)
THEN
1560 dad_steps(node) = pvs(abs(step(dad_steps(node))))
1566 na(i) = pvs(abs(step(na(i))))
1571 IF (fils(i).LT.0)
THEN
1572 fils(i) = -pvs(abs(step(-fils(i))))
1577 IF (
allocated(work))
DEALLOCATE(work)
1578 IF (k469_loc.EQ.2)
THEN
1579 IF (
allocated(trace_prv))
DEALLOCATE(trace_prv)
1580 IF (
allocated(workh_prv))
DEALLOCATE(workh_prv)
1581 IF (
allocated(gen2halo_prv))
DEALLOCATE(gen2halo_prv)
1584#if defined(ptscotch) || defined(scotch)
1585 IF (k482_loc.EQ.2.AND.nomp .GT. 0)
THEN
1586 CALL mumps_scotch_set_pthread_number (pthread_number)
1590 IF (k469_loc.NE.2)
THEN
1591 IF (
allocated(trace))
DEALLOCATE(trace)
1592 IF (
allocated(workh))
DEALLOCATE(workh)
1593 IF (
allocated(gen2halo))
DEALLOCATE(gen2halo)
1595 IF (
allocated(pvs))
DEALLOCATE(pvs)
1599 & N, MAPCOL, SIZEMAPCOL,
1600 & NSTEPS, LUMAT, FILS,
1601 & FRERE_STEPS, DAD_STEPS, STEP, NA, LNA, LRGROUPS,
1602 & SIZEOFBLOCKS, SYM, ICNTL, HALO_DEPTH, GROUP_SIZE,
1603 & SEP_SIZE, K38, K20,
1604 & K60, IFLAG, IERROR, K264, K265, K482, K472, MAXFRONT, K469,
1605 & K10, K54, K142, LPOK, LP,
1606 & COMM, MYID, NPROCS
1610 include
'mumps_tags.h'
1611 INTEGER :: IERR_MPI, MASTER
1612 PARAMETER( MASTER = 0 )
1613 integer :: status(mpi_status_size)
1614 INTEGER,
INTENT(IN) :: MYID, COMM, NPROCS
1616 INTEGER,
INTENT(IN) :: N, NSTEPS, LNA, SYM,
1617 & halo_depth, sep_size, group_size
1618 INTEGER,
INTENT(IN) :: SIZEMAPCOL
1619 INTEGER,
INTENT(IN) :: MAPCOL(SIZEMAPCOL)
1620 INTEGER,
INTENT(INOUT) :: IFLAG, IERROR
1621 INTEGER,
INTENT(INOUT) :: K38, K20, K264, K265
1622 INTEGER,
INTENT(IN) :: K482, K10, MAXFRONT, K60, K54
1623 INTEGER,
INTENT(IN) :: LP
1624 LOGICAL,
INTENT(IN) :: LPOK
1625 INTEGER,
INTENT(OUT) :: K142
1626 INTEGER,
INTENT(IN) :: ICNTL(60)
1627 INTEGER,
POINTER :: FILS(:), FRERE_STEPS(:), STEP(:),
1628 & NA(:), (:), LRGROUPS(:)
1629 INTEGER,
INTENT(IN) :: SIZEOFBLOCKS(N)
1630 INTEGER,
INTENT(IN) :: K472, K469
1631 INTEGER :: K482_LOC, K469_LOC, K38ou20,
1632 INTEGER :: I, F, PV, NV, NVEXPANDED, NODE
1633 REAL :: COMPRESS_RATIO
1634 LOGICAL :: PVSCHANGED
1635 INTEGER :: PVSCHANGED_INT, PVSCHANGED_INT_GLOB, IPROC
1636 INTEGER :: NBGROUPS, NBGROUPS_local
1637 INTEGER,
ALLOCATABLE,
DIMENSION (:) :: PVS, WORK
1638 INTEGER :: NBGROUPS_sent
1639 INTEGER :: NBNODES_LOC, SIZE_SENT, ISHIFT,
1641 INTEGER,
ALLOCATABLE,
DIMENSION (:) :: TRACE, WORKH,
1643 INTEGER,
ALLOCATABLE,
DIMENSION (:) :: TRACE_PRV, WORKH_PRV,
1645 INTEGER :: STEP_SCALAPACK_ROOT
1646 INTEGER :: GROUP_SIZE2, IERR, OMP_NUM
1647 INTEGER :: IERR_PRIV
1648 LOGICAL :: MAPCOL_PROVIDED
1649#if defined(ptscotch) || defined(scotch)
1651 LOGICAL :: SCOTCH_IS_THREAD_SAFE
1652 INTEGER :: PTHREAD_NUMBER, NOMP
1654 mapcol_provided = (mapcol(1).GE.0)
1655 k38ou20=
max(k38,k20)
1656 IF (k38ou20.GT.0)
THEN
1657 step_scalapack_root = step(k38ou20)
1659 step_scalapack_root = 0
1661 IF (mapcol_provided)
THEN
1662 CALL mpi_bcast( fils(1), n, mpi_integer,
1663 & master, comm, ierr )
1665 IF((k482.LE.0) .OR. (k482.GT.3))
THEN
1666#if defined(parmetis) || defined(metis) || defined(parmetis3) || defined(metis4)
1668#elif defined(ptscotch) || defined(scotch)
1673 ELSE IF (k482.EQ.1)
THEN
1674#if !defined(parmetis) && !defined(metis) && !defined(parmetis3) && !defined(metis4)
1675#if defined(ptscotch) || defined(scotch)
1683 ELSE IF (k482.EQ.2)
THEN
1684#if !defined(ptscotch) && !defined(scotch)
1685#if defined(parmetis) || defined(metis) || defined(parmetis3) || defined(metis4)
1693 ELSE IF (k482.EQ.3)
THEN
1697#if defined(ptscotch) || defined(scotch)
1698 scotch_is_thread_safe = .false.
1699 IF (k482_loc.EQ.2)
THEN
1700 CALL mumps_scotch_version (vscotch)
1701 IF (vscotch.GE.7) scotch_is_thread_safe=.true.
1703 IF (k482_loc.EQ.2.AND.(.NOT.scotch_is_thread_safe) )
THEN
1709 ALLOCATE( pvs(nsteps), stat=ierr)
1713 IF (lpok)
WRITE(lp,*)
" Error allocate integer array of ",
1718 IF (k469_loc.NE.2)
THEN
1719 ALLOCATE(trace(n), workh(n), gen2halo(n),
1722 IF (lpok)
WRITE(lp,*)
" Error allocate integer array of ",
1732 IF (iflag.LT.0)
GOTO 501
1733#if defined(ptscotch) || defined(scotch)
1735 IF (k482_loc.EQ.2)
THEN
1737 IF (nomp .GT. 0)
THEN
1738 CALL mumps_scotch_get_pthread_number (pthread_number)
1740 CALL mumps_scotch_set_pthread_number (nomp)
1745 pvschanged = .false.
1747!$ omp_num = omp_get_max_threads()
1748 omp_num =
min(omp_num,8)
1754!$omp&
IF (k469_loc.GT.1) num_threads(omp_num)
1755 ALLOCATE(work(2*maxfront+1), stat=ierr_priv)
1756 IF (ierr_priv.GT.0)
THEN
1757 IF (lpok)
WRITE(lp,*)
" Error allocate integer array of ",
1758 *
"size: ", 2*maxfront+1
1763 ierror = 2*maxfront+1
1766 IF (ierr_priv .EQ. 0 .AND. k469_loc.EQ.2)
THEN
1767 ALLOCATE(trace_prv(n), workh_prv(n), gen2halo_prv(n),
1769 IF (ierr_priv.GT.0)
THEN
1770 IF (lpok)
WRITE(lp,*)
" Error allocate integer array of "
1781 IF (iflag .LT. 0 )
THEN
1784 IF (k469_loc.EQ.2)
THEN
1793 IF (step(i).GT.0) pvs(step(i)) = i
1798 IF (iflag.LT.0) cycle
1799 IF (mapcol_provided)
THEN
1800 iproc = mapcol(node)
1801 IF (iproc.NE.myid)
THEN
1812 nvexpanded = nvexpanded+sizeofblocks(f)
1816 compress_ratio = real(nvexpanded)/real(nv)
1818 IF (nvexpanded .GE. group_size2)
THEN
1819 IF ( (k482_loc.EQ.3)
1821 & ( (k60.NE.0).AND.(work(1).EQ.k38ou20) )
1824 group_size2 =
max(int(real(group_size2)/compress_ratio), 1)
1827 lrgroups(work(i))=nbgroups+1+(i-1)/group_size2
1829 nbgroups = nbgroups + (nv-1)/group_size2 + 1
1832 IF (k469_loc .EQ. 2)
THEN
1834 & lrgroups, nbgroups, lumat, sizeofblocks,
1835 & group_size, halo_depth, trace_prv, workh_prv,
1836 & node, gen2halo_prv, k482_loc, k472, k469_loc,
1837 & sep_size, k142, k10, lp, lpok, iflag, ierror)
1840 & lrgroups, nbgroups, lumat, sizeofblocks,
1841 & group_size, halo_depth, trace, workh,
1842 & node, gen2halo, k482_loc, k472, k469_loc,
1843 & sep_size, k142, k10, lp, lpok, iflag, ierror)
1845 IF (iflag.LT.0) cycle
1850 step(work(1)) = abs(step(work(1)))
1851 IF (step(work(1)).EQ.step_scalapack_root)
THEN
1859 step(work(i+1)) = -step(work(1))
1860 IF (fils(work(i)).LE.0)
THEN
1861 fils(work(nv)) = fils(work(i))
1863 fils(work(i)) = work(i+1)
1868 nbgroups = nbgroups + 1
1869 nbgroups_local = nbgroups
1871 IF (nvexpanded .GE. sep_size)
THEN
1873 lrgroups( work(i) ) = nbgroups_local
1877 lrgroups( work(i) ) = -nbgroups_local
1889 IF (iflag.LT.0)
GOTO 500
1890 IF (k469_loc.EQ.2)
THEN
1891 IF (
allocated(trace_prv))
DEALLOCATE(trace_prv)
1892 IF (
allocated(workh_prv))
DEALLOCATE(workh_prv)
1893 IF (
allocated(gen2halo_prv))
DEALLOCATE(gen2halo_prv)
1896 IF (k469_loc.NE.2)
THEN
1897 IF (
allocated(workh))
DEALLOCATE(workh)
1898 IF (
allocated(trace))
DEALLOCATE(trace)
1899 IF (
allocated(gen2halo))
DEALLOCATE(gen2halo)
1902 IF (.NOT.mapcol_provided)
THEN
1904 IF (pvschanged)
THEN
1905 pvschanged_int_glob = 1
1907 pvschanged_int_glob = 0
1912 IF (pvschanged)
THEN
1919 & mpi_max, comm, ierr_mpi )
1920 pvschanged_int_glob = 1
1921 IF (pvschanged_int_glob.NE.0)
THEN
1922 IF (nprocs.GT.1)
THEN
1923 ALLOCATE(workh(2*n+3*nsteps+1), stat=ierr_priv)
1924 IF (ierr_priv.GT.0)
THEN
1925 IF (lpok)
WRITE(lp,*)
1926 &
" Error allocate integer array of ",
1927 &
"size: ", 2*maxfront+1
1929 ierror = 2*n+3*nsteps+1
1933 IF (iflag.LT.0)
GOTO 499
1934 IF (myid.EQ.master)
THEN
1936 DO WHILE (iproc.NE.nprocs-1)
1938 CALL mpi_recv( nbnodes_loc, 1, mpi_integer,
1940 & grouping, comm, status, ierr )
1941 msgsou = status( mpi_source )
1942 IF (nbnodes_loc.EQ.0)
THEN
1945 CALL mpi_recv( nbgroups_sent, 1, mpi_integer,
1946 & msgsou, grouping, comm, status, ierr )
1947 CALL mpi_recv( size_sent, 1, mpi_integer,
1948 & msgsou, grouping, comm, status, ierr )
1949 CALL mpi_recv( workh, size_sent, mpi_integer,
1950 & msgsou, grouping, comm, status, ierr )
1952 DO iloop=1, nbnodes_loc
1954 node = workh(ishift)
1957 pvs(node) = workh(ishift+1)
1958 step(workh(ishift+1)) = node
1959 IF (step(workh(ishift+1)).EQ.step_scalapack_root)
THEN
1961 k38 = workh(ishift+1)
1963 k20 = workh(ishift+1)
1967 step(workh(i+ishift)) = -node
1970 fils(workh(i+ishift)) = workh(i+1+ishift)
1971 IF (workh(nv+1+i+ishift).LT.0)
THEN
1972 lrgroups(workh(i+ishift)) =
1973 & - nbgroups + workh(nv+1+i+ishift)
1975 lrgroups(workh(i+ishift)) =
1976 & nbgroups + workh(nv+1+i+ishift)
1979 ishift = ishift + 2*nv +1
1981 nbgroups = nbgroups + nbgroups_sent
1988 iproc = mapcol(node)
1989 IF (iproc.EQ.myid)
THEN
1990 nbnodes_loc = nbnodes_loc + 1
1992 workh(ishift) = node
1998 workh(nv+ishift) = f
2002 workh(nv+1+ishift) = f
2004 workh(nv+1+i+ishift) = lrgroups(workh(i+ishift))
2006 ishift = ishift + 2*nv+1
2010 CALL mpi_send( nbnodes_loc, 1, mpi_integer, master,
2011 & grouping, comm, ierr )
2012 IF (nbnodes_loc.GT.0)
THEN
2013 CALL mpi_send( nbgroups, 1, mpi_integer, master,
2014 & grouping, comm, ierr )
2015 CALL mpi_send( size_sent, 1, mpi_integer, master,
2016 & grouping, comm, ierr )
2017 CALL mpi_send( workh, size_sent, mpi_integer, master,
2018 & grouping, comm, ierr )
2027 IF (iflag.LT.0)
GOTO 500
2028 IF (myid.EQ.master)
THEN
2029 IF (pvschanged_int_glob.EQ.0)
GOTO 500
2032 IF(frere_steps(node) .GT. 0)
THEN
2033 frere_steps(node) = pvs(abs(step(frere_steps(node))))
2034 ELSE IF(frere_steps(node) .LT. 0)
THEN
2035 frere_steps(node) = -pvs(abs(step(dad_steps(node))))
2037 IF(dad_steps(node) .NE. 0)
THEN
2038 dad_steps(node) = pvs(abs(step(dad_steps(node))))
2044 na(i) = pvs(abs(step(na(i))))
2049 IF (fils(i).LT.0)
THEN
2050 fils(i) = -pvs(abs(step(-fils(i))))
2056 IF (
allocated(work))
DEALLOCATE(work)
2057 IF (k469_loc.EQ.2)
THEN
2058 IF (
allocated(trace_prv))
DEALLOCATE(trace_prv)
2059 IF (
allocated(workh_prv))
DEALLOCATE(workh_prv)
2060 IF (
allocated(gen2halo_prv))
DEALLOCATE(gen2halo_prv)
2066 & mpi_max, master, comm, ierr_mpi )
2068#if defined(ptscotch) || defined(scotch)
2069 IF (k482_loc.EQ.2.AND.nomp .GT. 0)
THEN
2070 CALL mumps_scotch_set_pthread_number (pthread_number)
2074 IF (k469_loc.NE.2)
THEN
2075 IF (
allocated(trace))
DEALLOCATE(trace)
2076 IF (
allocated(workh))
DEALLOCATE(workh)
2077 IF (
allocated(gen2halo))
DEALLOCATE(gen2halo)
2079 IF (
allocated(pvs))
DEALLOCATE(pvs)
subroutine mumps_propinfo(icntl, info, comm, id)
subroutine mpi_recv(buf, cnt, datatype, source, tag, comm, status, ierr)
subroutine mpi_reduce(sendbuf, recvbuf, cnt, datatype, op, root, comm, ierr)
subroutine mpi_send(buf, cnt, datatype, dest, tag, comm, ierr)
subroutine mpi_allreduce(sendbuf, recvbuf, cnt, datatype, operation, comm, ierr)
subroutine mpi_bcast(buffer, cnt, datatype, root, comm, ierr)
subroutine compute_blr_vcs(k472, ibcksz, maxsize, nass)
subroutine mumps_upd_tree(nv, nsteps, n, first, lptr, rptr, f, vlist, fils, frere_steps, step, dad_steps, ne_steps, na, lna, pvs, k38, step_scalapack_root)
subroutine gethalograph(halo, nhalo, n, iw, lw, ipe, iptrhalo, jcnhalo, haloedgenbr, trace, node, gen2halo)
subroutine gethalonodes(n, iw, lw, ipe, ind, nind, pmax, nhalo, trace, workh, node, len, cnt, gen2halo)
subroutine gethalograph_ab(halo, nsep, nhalo, n, lumat, iptrhalo, jcnhalo, haloedgenbr, trace, node, gen2halo, iq)
subroutine get_global_groups(parts, sep, nsep, nparts, lrgroups, n, nbgroups, lrgroups_sign, maxsize_parts_loc)
subroutine smumps_ab_lr_mpi_grouping(n, mapcol, sizemapcol, nsteps, lumat, fils, frere_steps, dad_steps, step, na, lna, lrgroups, sizeofblocks, sym, icntl, halo_depth, group_size, sep_size, k38, k20, k60, iflag, ierror, k264, k265, k482, k472, maxfront, k469, k10, k54, k142, lpok, lp, comm, myid, nprocs)
subroutine smumps_lr_grouping(n, nz8, nsteps, irn, jcn, fils, frere_steps, dad_steps, ne_steps, step, na, lna, lrgroups, sym, icntl, halo_depth, group_size, sep_size, k38, k20, k60, iflag, ierror, k264, k265, k482, k472, maxfront, k10, k54, k142, lpok, lp, gather_matrix_allocated)
subroutine gethalonodes_ab(n, lumat, ind, nind, pmax, nhalo, trace, workh, node, haloedgenbr, gen2halo)
subroutine smumps_ab_lr_grouping(n, mapcol, sizemapcol, nsteps, lumat, fils, frere_steps, dad_steps, step, na, lna, lrgroups, sizeofblocks, sym, icntl, halo_depth, group_size, sep_size, k38, k20, k60, iflag, ierror, k264, k265, k482, k472, maxfront, k469, k10, k54, k142, lpok, lp, myid, comm)
subroutine get_cut(iwr, nass, ncb, lrgroups, npartscb, npartsass, cut)
subroutine sep_grouping_ab(nv, nvexpanded, vlist, n, lrgroups, nbgroups, lumat, sizeofblocks, group_size, halo_depth, trace, workh, node, gen2halo, k482, k472, k469, sep_size, maxsize_parts, keep10, lp, lpok, iflag, ierror)
subroutine sep_grouping(nv, vlist, n, nz, lrgroups, nbgroups, iw, lw, ipe, len, group_size, halo_depth, trace, workh, node, gen2halo, k482, k472, k469, sep_size, maxsize_parts, keep10, lp, lpok, iflag, ierror)
subroutine get_groups(nhalo, parts, sep, nsep, nparts, cut, newsep, perm, iperm)
subroutine smumps_lr_grouping_new(n, nz8, nsteps, irn, jcn, fils, frere_steps, dad_steps, step, na, lna, lrgroups, sym, icntl, halo_depth, group_size, sep_size, k38, k20, k60, iflag, ierror, k264, k265, k482, k472, maxfront, k469, k10, k54, k142, lpok, lp, gather_matrix_allocated)
subroutine neighborhood(halo, nhalo, n, iw, lw, ipe, trace, node, len, cnt, last_lvl_start, depth, pmax, gen2halo)
subroutine smumps_ana_gnew(n, nz, irn, icn, iw, lw, ipe, len, iq, flag, iwfr, nrorm, niorm, iflag, ierror, icntl, symmetry, sym, nbqd, avgdens, keep264, keep265, printstat, inplace64_graph_copy)