23 SUBROUTINE get_cut(IWR, NASS, NCB, LRGROUPS, NPARTSCB,
25 INTEGER,
INTENT(IN) :: NASS, NCB
26 INTEGER,
INTENT(IN) :: IWR(*)
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) :: (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(dble(nv+group_size2-1)/dble(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) :: , NVEXPANDED,
223 & n, group_size, halo_depth
224 INTEGER,
INTENT(IN) :: SIZEOFBLOCKS(N)
225 INTEGER,
INTENT(IN) :: NODE, K482
226 INTEGER,
INTENT(IN) :: K472, K469, , KEEP10, LP
228 INTEGER,
INTENT(INOUT) :: NBGROUPS, WORKH(N)
229 INTEGER,
INTENT(INOUT) :: VLIST(NV), TRACE(N)
230 INTEGER :: LRGROUPS(:)
231 INTEGER,
INTENT(INOUT) :: (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(:) :: VWGT
237 INTEGER(8) :: HALOEDGENBR
239 & nbgroups_kway, i, group_size2, lrgroups_sign, ierr
240 INTEGER :: MAXSIZE_PARTS_LOC
241 DOUBLE PRECISION :: 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= dble(nvexpanded)/dble(nv)
251 & int(dble(nvexpanded+group_size2-1)/dble(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)
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)
282!$omp
END CRITICAL(gethalo_cri)
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(dble(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,
385 TYPE(lmatrix_t) :: LUMAT
386 INTEGER,
DIMENSION(:),
INTENT(IN) :: IND
387 INTEGER,
INTENT(IN) :: N, NODE
388 INTEGER,
INTENT(IN) :: PMAX,NIND
389 INTEGER,
INTENT(OUT) :: NHALO
390 INTEGER,
INTENT(INOUT) :: TRACE(N), WORKH(N)
391 INTEGER :: GEN2HALO(N)
392 INTEGER(8),
INTENT(OUT) ::
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) :: N
436 TYPE(lmatrix_t) :: LUMAT
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:: ,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
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, , 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) :: , NODE, DEPTH, PMAX
630 INTEGER,
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,
641 INTEGER,
DIMENSION(:),
POINTER :: ADJI
644 avgdens = nint(dble(ipe(n+1)-1_8)/dble(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):: NHALO, 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,,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,,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
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) :: K142
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, RPTR, 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
905 CALL compute_blr_vcs(k472, group_size2, group_size, nv)
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
936 CALL mumps_upd_tree(nv, nsteps, n, first, lptr, rptr, f,
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,
984 INTEGER,
INTENT(IN) :: K482, K10, MAXFRONT, K60, K54
985 INTEGER,
INTENT(IN) :: LP
986 LOGICAL,
INTENT(IN) :: LPOK
987 INTEGER,
POINTER,
DIMENSION(:) :: IRN, JCN
988 INTEGER,
INTENT(IN) :: ICNTL(60)
989 INTEGER,
POINTER :: (:), 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 :: GROUP_SIZE2, 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
1174 CALL compute_blr_vcs(k472, group_size2, group_size, nv)
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
1298 TYPE(lmatrix_t) :: LUMAT
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()
1313 INTEGER,
INTENT(IN) :: K472, K469
1314 INTEGER :: K482_LOC, K469_LOC, K38ou20
1315 INTEGER :: I, F, PV, NV, NVEXPANDED, NODE
1316 DOUBLE PRECISION :: 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, OMP_NUM
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
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)
1420!$omp& workh_prv, trace_prv, gen2halo_prv, nbgroups_local,
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
1436.EQ..AND..EQ.
IF (IERR_PRIV 0 K469_LOC2) THEN
1437 ALLOCATE(TRACE_PRV(N), WORKH_PRV(N), GEN2HALO_PRV(N),
1439.GT.
IF (IERR_PRIV0) THEN
1440 IF (LPOK) WRITE(LP,*) " Error allocate
integer array of
",
1449.LT.
IF (IFLAG 0 ) THEN
1452.EQ.
IF (K469_LOC2) THEN
1461.GT.
IF (STEP(I)0) PVS(STEP(I)) = I
1464!$OMP DO SCHEDULE(DYNAMIC,1)
1466.LT.
IF (IFLAG0) CYCLE
1467 IF (MAPCOL_PROVIDED) THEN
1468.NE.
IF (MAPCOL(NODE)MYID) THEN
1479 NVEXPANDED = NVEXPANDED+SIZEOFBLOCKS(F)
1483 COMPRESS_RATIO = dble(NVEXPANDED)/dble(NV)
1484 CALL COMPUTE_BLR_VCS(K472, GROUP_SIZE2, GROUP_SIZE, NVEXPANDED)
1485.GE.
IF (NVEXPANDED GROUP_SIZE2) THEN
1486.EQ.
IF ( (K482_LOC3)
1488.NE..AND..EQ.
& ( (K600)(WORK(1)K38ou20) )
1491 GROUP_SIZE2 = max(int(dble(GROUP_SIZE2)/COMPRESS_RATIO), 1)
1492!$OMP CRITICAL(lrgrouping_cri)
1494 LRGROUPS(WORK(I))=NBGROUPS+1+(I-1)/GROUP_SIZE2
1496 NBGROUPS = NBGROUPS + (NV-1)/GROUP_SIZE2 + 1
1497!$OMP END CRITICAL(lrgrouping_cri)
1499.EQ.
IF (K469_LOC 2) THEN
1500 CALL SEP_GROUPING_AB(NV, NVEXPANDED, WORK(1), N,
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)
1506 CALL SEP_GROUPING_AB(NV, NVEXPANDED, WORK(1), N,
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.LT.
IF (IFLAG0) CYCLE
1517 STEP(WORK(1)) = ABS(STEP(WORK(1)))
1518.EQ.
IF (STEP(WORK(1))STEP_SCALAPACK_ROOT) THEN
1526 STEP(WORK(I+1)) = -STEP(WORK(1))
1527.LE.
IF (FILS(WORK(I))0) THEN
1528 FILS(WORK(NV)) = FILS(WORK(I))
1530 FILS(WORK(I)) = WORK(I+1)
1534!$OMP CRITICAL(lrgrouping_cri)
1535 NBGROUPS = NBGROUPS + 1
1536 NBGROUPS_local = NBGROUPS
1537!$OMP END CRITICAL(lrgrouping_cri)
1538.GE.
IF (NVEXPANDED SEP_SIZE) THEN
1540 LRGROUPS( WORK(I) ) = NBGROUPS_local
1544 LRGROUPS( WORK(I) ) = -NBGROUPS_local
1550.LT.
IF (IFLAG0) GOTO 500
1551.NOT.
IF (PVSCHANGED) GOTO 500
1554.GT.
IF(FRERE_STEPS(NODE) 0) THEN
1555 FRERE_STEPS(NODE) = PVS(ABS(STEP(FRERE_STEPS(NODE))))
1556.LT.
ELSE IF(FRERE_STEPS(NODE) 0) THEN
1557 FRERE_STEPS(NODE) = -PVS(ABS(STEP(DAD_STEPS(NODE))))
1559.NE.
IF(DAD_STEPS(NODE) 0) THEN
1560 DAD_STEPS(NODE) = PVS(ABS(STEP(DAD_STEPS(NODE))))
1566 NA(I) = PVS(ABS(STEP(NA(I))))
1571.LT.
IF (FILS(I)0) THEN
1572 FILS(I) = -PVS(ABS(STEP(-FILS(I))))
1577 IF (allocated(WORK)) DEALLOCATE(WORK)
1578.EQ.
IF (K469_LOC2) 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.EQ..AND..GT.
IF (K482_LOC2NOMP 0) THEN
1586 CALL MUMPS_SCOTCH_SET_PTHREAD_NUMBER (PTHREAD_NUMBER)
1590.NE.
IF (K469_LOC2) 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)
1597 END SUBROUTINE ZMUMPS_AB_LR_GROUPING
1598 SUBROUTINE ZMUMPS_AB_LR_MPI_GROUPING(
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
1615 TYPE(LMATRIX_T) :: LUMAT
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(:), DAD_STEPS(:), LRGROUPS(:)
1629 INTEGER, INTENT(IN) :: SIZEOFBLOCKS(N)
1630 INTEGER, INTENT(IN) :: K472, K469
1631 INTEGER :: K482_LOC, K469_LOC, K38ou20, K142_GLOB
1632 INTEGER :: I, F, PV, NV, NVEXPANDED, NODE
1633 DOUBLE PRECISION :: 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.GE.
MAPCOL_PROVIDED = (MAPCOL(1)0)
1655 K38ou20=max(K38,K20)
1656.GT.
IF (K38ou200) 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.LE..OR..GT.
IF((K4820) (K4823)) THEN
1666#if defined(parmetis) || defined(metis) || defined(parmetis3) || defined(metis4)
1668#elif defined(ptscotch) || defined(scotch)
1673.EQ.
ELSE IF (K4821) THEN
1674#if !defined(parmetis) && !defined(metis) && !defined(parmetis3) && !defined(metis4)
1675#if defined(ptscotch) || defined(scotch)
1683.EQ.
ELSE IF (K4822) THEN
1684#if !defined(ptscotch) && !defined(scotch)
1685#if defined(parmetis) || defined(metis) || defined(parmetis3) || defined(metis4)
1693.EQ.
ELSE IF (K4823) THEN
1697#if defined(ptscotch) || defined(scotch)
1698 SCOTCH_IS_THREAD_SAFE = .FALSE.
1699.EQ.
IF (K482_LOC2) THEN
1700 CALL MUMPS_SCOTCH_VERSION (VSCOTCH)
1701.GE.
IF (VSCOTCH7) SCOTCH_IS_THREAD_SAFE=.TRUE.
1703.EQ..AND..NOT.
IF (K482_LOC2(SCOTCH_IS_THREAD_SAFE) ) THEN
1709 ALLOCATE( PVS(NSTEPS), STAT=IERR)
1713 IF (LPOK) WRITE(LP,*) " Error allocate
integer array of
",
1718.NE.
IF (K469_LOC2) THEN
1719 ALLOCATE(TRACE(N), WORKH(N), GEN2HALO(N),
1722 IF (LPOK) WRITE(LP,*) " Error allocate
integer array of
",
1730 CALL MUMPS_PROPINFO( ICNTL(1), IFLAG,
1732.LT.
IF (IFLAG0) GOTO 501
1733#if defined(ptscotch) || defined(scotch)
1735.EQ.
IF (K482_LOC2) THEN
1736!$ NOMP=omp_get_max_threads()
1737.GT.
IF (NOMP 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)
1749!$OMP PARALLEL PRIVATE(I, NODE, PV, NV, F, GROUP_SIZE2, WORK, IERR_PRIV,
1750!$OMP& WORKH_PRV, TRACE_PRV, GEN2HALO_PRV, NBGROUPS_local,
1751!$OMP& NVEXPANDED, COMPRESS_RATIO, IPROC
1753!$OMP& REDUCTION( max : K142)
1754.GT.
!$OMP& IF (K469_LOC1) NUM_THREADS(OMP_NUM)
1755 ALLOCATE(WORK(2*MAXFRONT+1), STAT=IERR_PRIV)
1756.GT.
IF (IERR_PRIV0) THEN
1757 IF (LPOK) WRITE(LP,*) " Error allocate
integer array of
",
1758 * "size:
", 2*MAXFRONT+1
1763 IERROR = 2*MAXFRONT+1
1766.EQ..AND..EQ.
IF (IERR_PRIV 0 K469_LOC2) THEN
1767 ALLOCATE(TRACE_PRV(N), WORKH_PRV(N), GEN2HALO_PRV(N),
1769.GT.
IF (IERR_PRIV0) THEN
1770 IF (LPOK) WRITE(LP,*) " Error allocate
integer array of
",
1781.LT.
IF (IFLAG 0 ) THEN
1784.EQ.
IF (K469_LOC2) THEN
1793.GT.
IF (STEP(I)0) PVS(STEP(I)) = I
1796!$OMP DO SCHEDULE(DYNAMIC,1)
1798.LT.
IF (IFLAG0) CYCLE
1799 IF (MAPCOL_PROVIDED) THEN
1800 IPROC = MAPCOL(NODE)
1801.NE.
IF (IPROCMYID) THEN
1812 NVEXPANDED = NVEXPANDED+SIZEOFBLOCKS(F)
1816 COMPRESS_RATIO = dble(NVEXPANDED)/dble(NV)
1817 CALL COMPUTE_BLR_VCS(K472, GROUP_SIZE2, GROUP_SIZE, NVEXPANDED)
1818.GE.
IF (NVEXPANDED GROUP_SIZE2) THEN
1819.EQ.
IF ( (K482_LOC3)
1821.NE..AND..EQ.
& ( (K600)(WORK(1)K38ou20) )
1824 GROUP_SIZE2 = max(int(dble(GROUP_SIZE2)/COMPRESS_RATIO), 1)
1825!$OMP CRITICAL(lrgrouping_cri)
1827 LRGROUPS(WORK(I))=NBGROUPS+1+(I-1)/GROUP_SIZE2
1829 NBGROUPS = NBGROUPS + (NV-1)/GROUP_SIZE2 + 1
1830!$OMP END CRITICAL(lrgrouping_cri)
1832.EQ.
IF (K469_LOC 2) THEN
1833 CALL SEP_GROUPING_AB(NV, NVEXPANDED, WORK(1), N,
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)
1839 CALL SEP_GROUPING_AB(NV, NVEXPANDED, WORK(1), N,
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.LT.
IF (IFLAG0) CYCLE
1850 STEP(WORK(1)) = ABS(STEP(WORK(1)))
1851.EQ.
IF (STEP(WORK(1))STEP_SCALAPACK_ROOT) THEN
1859 STEP(WORK(I+1)) = -STEP(WORK(1))
1860.LE.
IF (FILS(WORK(I))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.GE.
IF (NVEXPANDED SEP_SIZE) THEN
1873 LRGROUPS( WORK(I) ) = NBGROUPS_local
1877 LRGROUPS( WORK(I) ) = -NBGROUPS_local
1885 CALL MUMPS_PROPINFO( ICNTL(1), IFLAG,
1889.LT.
IF (IFLAG0) GOTO 500
1890.EQ.
IF (K469_LOC2) 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.NE.
IF (K469_LOC2) THEN
1897 IF (allocated(WORKH)) DEALLOCATE(WORKH)
1898 IF (allocated(TRACE)) DEALLOCATE(TRACE)
1899 IF (allocated(GEN2HALO)) DEALLOCATE(GEN2HALO)
1902.NOT.
IF (MAPCOL_PROVIDED) THEN
1904 IF (PVSCHANGED) THEN
1905 PVSCHANGED_INT_GLOB = 1
1907 PVSCHANGED_INT_GLOB = 0
1912 IF (PVSCHANGED) THEN
1917 CALL MPI_ALLREDUCE( PVSCHANGED_INT, PVSCHANGED_INT_GLOB, 1,
1919 & MPI_MAX, COMM, IERR_MPI )
1920 PVSCHANGED_INT_GLOB = 1
1921.NE.
IF (PVSCHANGED_INT_GLOB0) THEN
1922.GT.
IF (NPROCS1) THEN
1923 ALLOCATE(WORKH(2*N+3*NSTEPS+1), STAT=IERR_PRIV)
1924.GT.
IF (IERR_PRIV0) THEN
1925 IF (LPOK) WRITE(LP,*)
1926 & " allocate
integer array of
",
1927 & "size:
", 2*MAXFRONT+1
1929 IERROR = 2*N+3*NSTEPS+1
1931 CALL MUMPS_PROPINFO( ICNTL(1), IFLAG,
1933.LT.
IF (IFLAG0) GOTO 499
1934.EQ.
IF (MYIDMASTER) THEN
1936.NE.
DO WHILE (IPROCNPROCS-1)
1938 CALL MPI_RECV( NBNODES_LOC, 1, MPI_INTEGER,
1940 & GROUPING, COMM, STATUS, IERR )
1941 MSGSOU = STATUS( MPI_SOURCE )
1942.EQ.
IF (NBNODES_LOC0) 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.EQ.
IF (STEP(WORKH(ISHIFT+1))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.LT.
IF (WORKH(NV+1+I+ISHIFT)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.EQ.
IF (IPROCMYID) 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.GT.
IF (NBNODES_LOC0) 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.LT.
IF (IFLAG0) GOTO 500
2028.EQ.
IF (MYIDMASTER) THEN
2029.EQ.
IF (PVSCHANGED_INT_GLOB0) GOTO 500
2032.GT.
IF(FRERE_STEPS(NODE) 0) THEN
2033 FRERE_STEPS(NODE) = PVS(ABS(STEP(FRERE_STEPS(NODE))))
2034.LT.
ELSE IF(FRERE_STEPS(NODE) 0) THEN
2035 FRERE_STEPS(NODE) = -PVS(ABS(STEP(DAD_STEPS(NODE))))
2037.NE.
IF(DAD_STEPS(NODE) 0) THEN
2038 DAD_STEPS(NODE) = PVS(ABS(STEP(DAD_STEPS(NODE))))
2044 NA(I) = PVS(ABS(STEP(NA(I))))
2049.LT.
IF (FILS(I)0) THEN
2050 FILS(I) = -PVS(ABS(STEP(-FILS(I))))
2056 IF (allocated(WORK)) DEALLOCATE(WORK)
2057.EQ.
IF (K469_LOC2) 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)
2064 CALL MPI_REDUCE( K142, K142_GLOB, 1,
2066 & MPI_MAX, MASTER, COMM, IERR_MPI )
2068#if defined(ptscotch) || defined(scotch)
2069.EQ..AND..GT.
IF (K482_LOC2NOMP 0) THEN
2070 CALL MUMPS_SCOTCH_SET_PTHREAD_NUMBER (PTHREAD_NUMBER)
2074.NE.
IF (K469_LOC2) 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)
2081 END SUBROUTINE ZMUMPS_AB_LR_MPI_GROUPING
2082 END MODULE ZMUMPS_ANA_LR
subroutine compute_blr_vcs(k472, ibcksz, maxsize, nass)
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 neighborhood(halo, nhalo, n, iw, lw, ipe, trace, node, len, cnt, last_lvl_start, depth, pmax, gen2halo)
subroutine get_groups(nhalo, parts, sep, nsep, nparts, cut, newsep, perm, iperm)
subroutine gethalograph_ab(halo, nsep, nhalo, n, lumat, iptrhalo, jcnhalo, haloedgenbr, trace, node, gen2halo, iq)
subroutine zmumps_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 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 gethalonodes_ab(n, lumat, ind, nind, pmax, nhalo, trace, workh, node, haloedgenbr, gen2halo)
subroutine gethalograph(halo, nhalo, n, iw, lw, ipe, iptrhalo, jcnhalo, haloedgenbr, trace, node, gen2halo)
subroutine zmumps_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 get_global_groups(parts, sep, nsep, nparts, lrgroups, n, nbgroups, lrgroups_sign, maxsize_parts_loc)
subroutine zmumps_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 gethalonodes(n, iw, lw, ipe, ind, nind, pmax, nhalo, trace, workh, node, len, cnt, gen2halo)
subroutine zmumps_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)