162 & N, IWLEN, PE, PFREE, LEN, IW, NV, ELEN,
163 & LAST, NCMPA, DEGREE, HEAD, NEXT, W, PARENT)
169 INTEGER,
INTENT(IN) :: TOTEL, N
170 INTEGER(8),
INTENT(IN) :: IWLEN
171 LOGICAL,
INTENT(IN) :: COMPUTE_PERM
173 INTEGER,
INTENT(INOUT) :: LEN(N), IW(IWLEN)
176 INTEGER,
INTENT(OUT) :: NCMPA
177 INTEGER,
INTENT(OUT) :: ELEN(N), LAST(N), PARENT(N)
180 INTEGER(8),
INTENT(INOUT) :: PFREE
181 INTEGER(8),
INTENT(INOUT) :: PE(N)
183 INTEGER,
INTENT(INOUT) :: NV(N)
186 INTEGER :: NEXT(N), DEGREE(N), HEAD(TOTEL), W(N)
430 INTEGER :: DEG, DEGME, DEXT, DMAX, E, ELENME, ELN, I,
431 & ILAST, INEXT, , JLAST, JNEXT, K, KNT1, KNT2, KNT3,
432 & lenj, ln, me, mindeg, nel,
433 & nleft, nvi, nvj, nvpiv, slenme, we, wflg, wnvi, x
434 INTEGER KNT1_UPDATED, KNT2_UPDATED
435 INTEGER(8) :: MAXMEM, MEM, NEWMEM
437 INTEGER(8) :: HASH, HMOD
480 INTEGER(8) P, P1, P2, P3, PDST, PEND, PJ, PME,
481 & PME1, PME2, PN, PSRC
508 maxint_n=huge(wflg)-n
512 hmod = int(
max(1, n-1),kind=8)
525 IF(nv(1) .LT. 0)
THEN
533 DO p= pe(i) , pe(i)+int(len(i)-1,8)
534 degree(i) = degree(i) + nv(iw(p))
554 IF (inext .NE. 0) last(inext) = i
571 30
IF (nel .LT. totel)
THEN
578 DO 40 deg = mindeg, totel
580 IF (me .GT. 0)
GO TO 50
587 IF (inext .NE. 0) last(inext) = 0
596 elen(me) = - (nel + 1)
612 IF (elenme .EQ. 0)
THEN
618 DO 60 p = pme1, pme1 + len(me) - 1
636 IF (inext .NE. 0) last(inext) = ilast
637 IF (ilast .NE. 0)
THEN
641 head(degree(i)) = inext
653 slenme = len(me) - elenme
655 DO 120 knt1 = 1, elenme + 1
656 knt1_updated = knt1_updated +1
657 IF (knt1 .GT. elenme)
THEN
677 knt2_updated = knt2_updated+1
685 IF (pfree .GT. iwlen)
THEN
691 len(me) = len(me) - knt1_updated
696 IF (len(me) .EQ. 0) pe(me) = 0
698 len(e) = ln - knt2_updated
703 IF (len(e) .EQ. 0) pe(e) = 0
710 pe(j) = int(iw(pn), 8)
720 IF (psrc .LE. pend)
THEN
725 iw (pdst) = int(pe(j))
730 DO 90 knt3 = 0, lenj - 2
731 iw(pdst + knt3) = iw(psrc + knt3)
733 pdst = pdst + lenj - 1
734 psrc = psrc + lenj - 1
740 DO 100 psrc = pme1, pfree - 1
763 IF (inext .NE. 0) last(inext) = ilast
764 IF (ilast .NE. 0)
THEN
768 head(degree(i)) = inext
781 newmem = pfree - pme1
783 maxmem =
max(maxmem, mem)
791 len(me) = int(pme2 - pme1 + 1)
796 IF (wflg .GT. maxint_n)
THEN
798 IF (w(x) .NE. 0) w(x) = 1
817 DO 150 pme = pme1, pme2
824 DO 140 p = pe(i), pe(i) + eln - 1
827 IF (we .GE. wflg)
THEN
830 ELSE IF (we .NE. 0)
THEN
833 we = degree(e) + wnvi
849 DO 180 pme = pme1, pme2
852 p2 = p1 + elen(i) - 1
863 IF (dext .GT. 0)
THEN
867 hash = hash + int(e,kind=8)
868 ELSE IF (dext .EQ. 0)
THEN
872 hash = hash + int(e,kind=8)
882 elen(i) = int(pn - p1 + 1)
887 DO 170 p = p2 + 1, p1 + int(len(i) - 1,8)
896 hash = hash + int(j,kind=8)
903 IF (deg.EQ.0.AND.(elen(i).GT.1))
THEN
908 p2 = p1 + int(elen(i),8) - 2_8
938 degree(i) =
min(degree(i), deg)
949 len(i) = int(pn - p1 + 1)
953 hash = mod(hash, hmod) + 1_8
965 last(i) = int(hash,kind=kind(last))
972 dmax =
max(dmax, degme)
975 IF (wflg .GT. maxint_n)
THEN
977 IF (w(x) .NE. 0) w(x) = 1
985 DO 250 pme = pme1, pme2
987 IF (nv(i) .LT. 0)
THEN
997 IF (j .EQ. 0)
GO TO 250
1007 IF (i .EQ. 0)
GO TO 250
1010 IF (next(i) .NE. 0)
THEN
1019 DO 210 p = pe(i) + 1, pe(i) + ln - 1
1034 IF (len(j) .NE. ln)
GO TO 240
1036 IF (elen(j) .NE. eln)
GO TO 240
1038 DO 230 p = pe(j) + 1, pe(j) + ln - 1
1040 IF (w(iw(p)) .NE. wflg)
GO TO 240
1049 nv(i) = nv(i) + nv(j)
1070 IF (i .NE. 0)
GO TO 200
1079 DO 260 pme = pme1, pme2
1082 IF (nvi .GT. 0)
THEN
1089 deg =
min(degree(i) + degme - nvi, nleft - nvi)
1094 IF (inext .NE. 0) last(inext) = i
1101 mindeg =
min(mindeg, deg)
1113 nv(me) = nvpiv + degme
1116 len(me) = int(p - pme1)
1117 IF (len(me) .EQ. 0)
THEN
1122 IF (newmem .NE. 0)
THEN
1127 mem = mem - newmem + len(me)
1148 IF (elen(i) .EQ. 0)
THEN
1158 IF (elen(j) .GE. 0)
THEN
1176 IF (elen(j) .GE. 0)
THEN
1179 IF (elen(j) .EQ. 0)
THEN
1192 IF (compute_perm)
THEN
1210 IF(last(k) .NE. 0)
THEN
1217 IF (head(k-n) .NE. 0)
THEN
1246 parent(i) = int(pe(i))
1286 & LAST, NCMPA, DEGREE, HEAD, NEXT, W, PARENT)
1292 INTEGER,
INTENT(IN) :: N
1293 INTEGER(8),
INTENT(IN) :: IWLEN
1295 INTEGER,
INTENT(INOUT) :: LEN(N), IW(IWLEN)
1298 INTEGER,
INTENT(OUT) :: NCMPA
1299 INTEGER,
INTENT(OUT) :: NV(N), ELEN(N), (N), PARENT(N)
1302 INTEGER(8),
INTENT(INOUT) :: PFREE
1303 INTEGER(8),
INTENT(INOUT) :: PE(N)
1306 INTEGER NEXT(N), DEGREE(N), HEAD(N), W(N)
1544 INTEGER :: DEG, DEGME, DEXT, DMAX, E, ELENME, ELN, I,
1545 & ILAST, , J, JLAST, JNEXT, K, KNT1, KNT2, KNT3,
1546 & LENJ, LN, ME, MINDEG, NEL,
1547 & nleft, nvi, nvj, nvpiv, slenme, we, wflg, wnvi, x,
1549 INTEGER KNT1_UPDATED, KNT2_UPDATED
1550 INTEGER(8) :: MAXMEM, MEM, NEWMEM
1552 INTEGER(8) :: HASH, HMOD
1598 INTEGER(8) :: P, P1, P2, P3, PDST, PEND, PJ, PME, PME1, PME2,
1625 maxint_n=huge(wflg)-n
1629 hmod = int(
max(1, n-1),kind=8)
1642 IF (len(i).GE.0)
THEN
1651 IF ( pe(i) .NE. 0_8 )
THEN
1660 nv(j) = nv(j) + nv(i)
1672 IF (deg .GT. 0)
THEN
1677 IF (inext .NE. 0) last(inext) = i
1680 ELSE IF ( deg.EQ. 0)
THEN
1694 elen(i) = - (nel + 1)
1707 30
IF (nel .LT. n)
THEN
1714 DO 40 deg = mindeg, n
1716 IF (me .GT. 0)
GO TO 50
1723 IF (inext .NE. 0) last(inext) = 0
1732 elen(me) = - (nel + 1)
1748 IF (elenme .EQ. 0)
THEN
1754 DO 60 p = pme1, pme1 + int(len(me) - 1,8)
1757 IF (nvi .GT. 0)
THEN
1772 IF (inext .NE. 0) last(inext) = ilast
1773 IF (ilast .NE. 0)
THEN
1777 head(degree(i)) = inext
1789 slenme = len(me) - elenme
1791 DO 120 knt1 = 1, elenme + 1
1792 knt1_updated = knt1_updated +1
1793 IF (knt1 .GT. elenme)
THEN
1813 knt2_updated = knt2_updated+1
1817 IF (nvi .GT. 0)
THEN
1821 IF (pfree .GT. iwlen)
THEN
1827 len(me) = len(me) - knt1_updated
1832 IF (len(me) .EQ. 0) pe(me) = 0_8
1834 len(e) = ln - knt2_updated
1839 IF (len(e) .EQ. 0) pe(e) = 0_8
1845 IF (pn .GT. 0_8)
THEN
1846 pe(j) = int(iw(pn),8)
1856 IF (psrc .LE. pend)
THEN
1861 iw(pdst) = int(pe(j))
1866 DO 90 knt3 = 0, lenj - 2
1867 iw(pdst + knt3) = iw(psrc + knt3)
1869 pdst = pdst + int(lenj - 1,8)
1870 psrc = psrc + int(lenj - 1,8)
1876 DO 100 psrc = pme1, pfree - 1
1899 IF (inext .NE. 0) last(inext) = ilast
1900 IF (ilast .NE. 0)
THEN
1904 head(degree(i)) = inext
1917 newmem = pfree - pme1
1919 maxmem =
max(maxmem, mem)
1927 len(me) = int(pme2 - pme1 + 1)
1932 IF (wflg .GT. maxint_n)
THEN
1934 IF (w(x) .NE. 0) w(x) = 1
1953 DO 150 pme = pme1, pme2
1956 IF (eln .GT. 0)
THEN
1960 DO 140 p = pe(i), pe(i) + int(eln - 1,8)
1963 IF (we .GE. wflg)
THEN
1966 ELSE IF (we .NE. 0)
THEN
1969 we = degree(e) + wnvi
1984 DO 180 pme = pme1, pme2
1987 p2 = p1 + int(elen(i) - 1,8)
1998 IF (dext .GT. 0)
THEN
2002 hash = hash + int(e,kind=8)
2003 ELSE IF (dext .EQ. 0)
THEN
2007 hash = hash + int(e,kind=8)
2017 elen(i) = int(pn - p1 + 1_8)
2022 DO 170 p = p2 + 1, p1 + int(len(i) - 1,8)
2025 IF (nvj .GT. 0)
THEN
2031 hash = hash + int(j,kind=8)
2038 IF (deg.EQ.0.AND.(elen(i).GT.1))
THEN
2043 p2 = p1 + int(elen(i),8) - 2_8
2052 IF (deg .EQ. 0)
THEN
2073 degree(i) =
min(degree(i), deg)
2084 len(i) = int(pn - p1 + 1_8)
2088 hash = mod(hash, hmod) + 1_8
2100 last(i) = int(hash,kind=kind(last))
2107 dmax =
max(dmax, degme)
2110 IF (wflg .GT. maxint_n)
THEN
2112 IF (w(x) .NE. 0) w(x) = 1
2120 DO 250 pme = pme1, pme2
2122 IF (nv(i) .LT. 0)
THEN
2129 hash = int(last(i),kind=8)
2132 IF (j .EQ. 0)
GO TO 250
2142 IF (i .EQ. 0)
GO TO 250
2145 IF (next(i) .NE. 0)
THEN
2154 DO 210 p = pe(i) + 1, pe(i) + int(ln - 1,8)
2169 IF (len(j) .NE. ln)
GO TO 240
2171 IF (elen(j) .NE. eln)
GO TO 240
2173 DO 230 p = pe(j) + 1, pe(j) + int(ln - 1,8)
2175 IF (w(iw(p)) .NE. wflg)
GO TO 240
2184 nv(i) = nv(i) + nv(j)
2205 IF (i .NE. 0)
GO TO 200
2214 DO 260 pme = pme1, pme2
2217 IF (nvi .GT. 0)
THEN
2224 deg =
min(degree(i) + degme - nvi, nleft - nvi)
2229 IF (inext .NE. 0) last(inext) = i
2236 mindeg =
min(mindeg, deg)
2248 nv(me) = nvpiv + degme
2251 len(me) = int(p - pme1)
2252 IF (len(me) .EQ. 0)
THEN
2257 IF (newmem .NE. 0)
THEN
2262 mem = mem - newmem + int(len(me),8)
2283 IF (elen(i) .EQ. 0)
THEN
2293 IF (elen(j) .GE. 0)
THEN
2311 IF (elen(j) .GE. 0)
THEN
2314 IF (elen(j) .EQ. 0)
THEN
2347 parent(i) = int(pe(i))
2370 & LAST, NCMPA, DEGREE, HEAD, NEXT, W, PARENT,
2371 & LISTVAR_SCHUR, SIZE_SCHUR)
2375 INTEGER,
intent(in) :: SIZE_SCHUR
2376 INTEGER,
intent(in) :: LISTVAR_SCHUR(SIZE_SCHUR)
2377 INTEGER,
INTENT(IN) :: N
2378 INTEGER(8),
INTENT(IN) :: IWLEN
2380 INTEGER,
INTENT(INOUT) :: LEN(N), (IWLEN)
2383 INTEGER,
INTENT(OUT) :: NCMPA
2384 INTEGER,
INTENT(OUT) :: NV(N), ELEN(N), LAST(N), PARENT(N)
2387 INTEGER(8),
INTENT(INOUT) :: PFREE
2388 INTEGER(8),
INTENT(INOUT) :: PE(N)
2391 INTEGER :: NEXT(N), DEGREE(N), HEAD(N), W(N)
2803 INTEGER :: DEG, DEGME, DEXT, DMAX, E, ELENME, ELN, I,
2804 & ILAST, INEXT, J, JLAST, JNEXT, K, KNT1, KNT2, KNT3,
2805 & LENJ, LN, ME, MINDEG, NEL,
2806 & NLEFT, NVI, NVJ, NVPIV, SLENME, WE, WFLG, WNVI, X,
2807 & nbflag, nreal, lastd, nelme
2808 INTEGER KNT1_UPDATED, KNT2_UPDATED
2809 INTEGER(8) :: MAXMEM, MEM, NEWMEM
2811 INTEGER(8) :: HASH, HMOD
2861 INTEGER(8) :: P, P1, P2, P3, PDST, PEND, PJ, PME, PME1, PME2,
2888 maxint_n=huge(wflg)-n
2892 hmod = int(
max(1, n-1),kind=8)
2914 i = listvar_schur(k)
2916 IF ((len(i) .EQ.0).OR.(len(i).EQ.-n-1))
THEN
2926 IF (lastd.EQ.0)
THEN
2949 IF (deg.EQ.n+1)
GOTO 20
2952 IF (deg .GT. 0)
THEN
2979 30
IF (nel .LT. nreal)
THEN
2987 DO 40 deg = mindeg, n
2989 IF (me .GT. 0)
GO TO 50
2994 write (*,*)
' ERROR 1 in HALO_AMD '
3004 IF (inext .NE. 0) last(inext) = 0
3013 elen(me) = - (nel + 1)
3029 IF (elenme .EQ. 0)
THEN
3035 DO 60 p = pme1, pme1 + len(me) - 1
3038 IF (nvi .GT. 0)
THEN
3049 IF (degree(i).LE.n)
THEN
3056 IF (inext .NE. 0) last(inext) = ilast
3057 IF (ilast .NE. 0)
THEN
3061 head(degree(i)) = inext
3076 slenme = len(me) - elenme
3078 DO 120 knt1 = 1, elenme + 1
3079 knt1_updated = knt1_updated +1
3080 IF (knt1 .GT. elenme)
THEN
3100 knt2_updated = knt2_updated+1
3104 IF (nvi .GT. 0)
THEN
3108 IF (pfree .GT. iwlen)
THEN
3114 len(me) = len(me) - knt1_updated
3119 IF (len(me) .EQ. 0) pe(me) = 0_8
3121 len(e) = ln - knt2_updated
3126 IF (len(e) .EQ. 0) pe(e) = 0
3133 pe(j) = int(iw(pn),8)
3143 IF (psrc .LE. pend)
THEN
3148 iw(pdst) = int(pe(j))
3153 DO 90 knt3 = 0, lenj - 2
3154 iw(pdst + knt3) = iw(psrc + knt3)
3156 pdst = pdst + lenj - 1
3157 psrc = psrc + lenj - 1
3163 DO 100 psrc = pme1, pfree - 1
3182 IF (degree(i).LE.n)
THEN
3190 IF (inext .NE. 0) last(inext) = ilast
3191 IF (ilast .NE. 0)
THEN
3195 head(degree(i)) = inext
3211 newmem = pfree - pme1
3213 maxmem =
max(maxmem, mem)
3221 len(me) = int(pme2 - pme1 + 1_8)
3226 IF (wflg .GT. maxint_n)
THEN
3228 IF (w(x) .NE. 0) w(x) = 1
3247 DO 150 pme = pme1, pme2
3250 IF (eln .GT. 0)
THEN
3254 DO 140 p = pe(i), pe(i) + int(eln - 1,8)
3257 IF (we .GE. wflg)
THEN
3260 ELSE IF (we .NE. 0)
THEN
3263 we = degree(e) + wnvi
3278 DO 180 pme = pme1, pme2
3281 p2 = p1 + elen(i) - 1
3292 IF (dext .GT. 0)
THEN
3296 hash = hash + int(e,kind=8)
3297 ELSE IF (dext .EQ. 0)
THEN
3311 elen(i) = int(pn - p1 + 1_8)
3316 DO 170 p = p2 + 1, p1 + int(len(i) - 1,8)
3319 IF (nvj .GT. 0)
THEN
3325 hash = hash + int(j,kind=8)
3329 IF (degree(i).EQ.n+1) deg = n+1
3335 IF (elen(i).EQ.1 .AND. p3.EQ.pn)
THEN
3337 IF (deg .EQ. 0)
THEN
3360 IF (degree(i).NE.n+1)
THEN
3362 deg =
min(deg, nleft)
3363 degree(i) =
min(degree(i), deg)
3376 len(i) = int(pn - p1 + 1)
3383 hash = mod(hash, hmod) + 1_8
3395 last(i) = int(hash, kind=kind(last))
3405 dmax =
max(dmax, degme)
3408 IF (wflg .GT. maxint_n)
THEN
3410 IF (w(x) .NE. 0) w(x) = 1
3418 DO 250 pme = pme1, pme2
3422 IF ( (nv(i) .LT. 0) .AND. (degree(i) .LE. n) )
THEN
3430 hash = int(last(i),kind=8)
3433 IF (j .EQ. 0)
GO TO 250
3443 IF (i .EQ. 0)
GO TO 250
3446 IF (next(i) .NE. 0)
THEN
3455 DO 210 p = pe(i) + 1, pe(i) + ln - 1
3470 IF (len(j) .NE. ln)
GO TO 240
3472 IF (elen(j) .NE. eln)
GO TO 240
3474 DO 230 p = pe(j) + 1, pe(j) + ln - 1
3476 IF (w(iw(p)) .NE. wflg)
GO TO 240
3485 nv(i) = nv(i) + nv(j)
3506 IF (i .NE. 0)
GO TO 200
3515 DO 260 pme = pme1, pme2
3518 IF (nvi .GT. 0)
THEN
3523 IF (degree(i).LE.n)
THEN
3528 deg =
min(degree(i) + degme - nvi, nleft - nvi)
3533 IF (inext .NE. 0) last(inext) = i
3540 mindeg =
min(mindeg, deg)
3555 nv(me) = nvpiv + degme
3558 len(me) = int(p - pme1)
3559 IF (len(me) .EQ. 0)
THEN
3564 IF (newmem .NE. 0)
THEN
3569 mem = mem - newmem + len(me)
3588 IF (me .GT. 0)
GO TO 51
3592 IF (me.NE.listvar_schur(1))
THEN
3593 write(6,*)
' ERROR 2 in MUMPS_HAMD '
3594 write(6,*)
' wrong principal var for Schur !!'
3601 IF ((pe(x).GT.0) .AND. (elen(x).LT.0))
THEN
3605 ELSEIF (degree(x).EQ.n+1)
THEN
3623 write(*,*)
' ERROR 2 in MUMPS_HAMD NEL, N=', nel,n
3642 IF (elen(i) .EQ. 0)
THEN
3652 IF (elen(j) .GE. 0)
THEN
3670 IF (elen(j) .GE. 0)
THEN
3673 IF (elen(j) .EQ. 0)
THEN
3706 parent(i) = int(pe(i))
3723 & (norig, n, compute_perm, nbbuck,
3724 & iwlen, pe, pfree, len, iw, nv, elen,
3725 & last, ncmpa, degree, wf, next, w, head
3737 INTEGER,
INTENT(IN) :: NORIG, N, NBBUCK
3738 LOGICAL,
INTENT(IN) :: COMPUTE_PERM
3739 INTEGER(8),
INTENT(IN) :: IWLEN
3741 INTEGER,
INTENT(INOUT) :: LEN(N), IW(IWLEN)
3743 INTEGER,
INTENT(INOUT) :: NV(N)
3746 INTEGER,
INTENT(OUT) :: NCMPA
3747 INTEGER,
INTENT(OUT) :: ELEN(N), LAST(N)
3748 INTEGER,
INTENT(OUT) :: PARENT(N)
3751 INTEGER(8),
INTENT(INOUT) :: PFREE
3752 INTEGER(8),
INTENT(INOUT) :: PE(N)
3757 INTEGER :: NEXT(N), DEGREE(N), W(N)
3758 INTEGER :: HEAD(0:NBBUCK+1), WF(N)
4133 INTEGER :: DEG, DEGME, DEXT, DMAX, E, ELENME, ELN, I,
4134 & ILAST, INEXT, J, , JNEXT, K, KNT1, KNT2, KNT3,
4135 & LENJ, LN, ME, MINDEG, NEL,
4136 & NLEFT, NVI, NVJ, NVPIV, , WE, WFLG, WNVI, X,
4137 & nbflag, lastd, nelme, wf3, wf4, n2, pas
4139 INTEGER KNT1_UPDATED, KNT2_UPDATED
4140 INTEGER(8) :: MAXMEM, MEM, NEWMEM
4142 INTEGER(8) :: HASH, HMOD
4143 DOUBLE PRECISION RMF, RMF1
4198 INTEGER(8) :: P, P1, P2, P3, PDST, PEND, PJ, PME, PME1, PME2,
4220 INTRINSIC max,
min, mod, huge
4230 idummy = huge(idummy) - 1
4231 dummy = dble(idummy)
4239 maxint_n=huge(wflg)-n
4242 hmod = int(
max(1, nbbuck-1),kind=8)
4251 head(0:nbbuck+1) = 0
4258 IF(nv(1) .LT. 0)
THEN
4266 IF (len(i).LT.0)
THEN
4270 IF (len(i).EQ.-norig-1)
THEN
4281 totel = totel + nv(i)
4283 DO p= pe(i) , pe(i)+int(len(i)-1,8)
4284 degree(i) = degree(i) + nv(iw(p))
4292 IF (len(i).LT.0)
THEN
4295 nleft_v1 = nleft_v1 + nv(i)
4296 IF (len(i).EQ.-n-1)
THEN
4325 IF (lastd.EQ.0)
THEN
4341 IF (deg .GT. 0)
THEN
4344 IF (deg.GT.norig)
THEN
4345 deg =
min(((deg-norig)/pas) + norig, nbbuck)
4354 IF (inext .NE. 0) last(inext) = i
4373 nleft = totel-nel + nleft_v1
4376 30
IF (nel .LT. totel)
THEN
4383 DO 40 deg = mindeg, nbbuck
4385 IF (me .GT. 0)
GO TO 50
4392 IF (deg.GT.norig)
THEN
4403 IF (wf(j).LT.k)
THEN
4412 IF (inext .NE. 0) last(inext) = ilast
4413 IF (ilast .NE. 0)
THEN
4425 IF (inext .NE. 0) last(inext) = 0
4435 elen(me) = - (nel + 1)
4451 IF (elenme .EQ. 0)
THEN
4457 DO 60 p = pme1, pme1 + len(me) - 1
4460 IF (nvi .GT. 0)
THEN
4470 IF (degree(i).NE.n2)
THEN
4476 IF (inext .NE. 0) last(inext) = ilast
4477 IF (ilast .NE. 0)
THEN
4481 IF (wf(i).GT.norig)
THEN
4482 deg =
min(((wf(i)-norig)/pas) + norig, nbbuck)
4499 slenme = len(me) - elenme
4501 DO 120 knt1 = 1, elenme + 1
4502 knt1_updated = knt1_updated +1
4503 IF (knt1 .GT. elenme)
THEN
4523 knt2_updated = knt2_updated+1
4527 IF (nvi .GT. 0)
THEN
4531 IF (pfree .GT. iwlen)
THEN
4537 len(me) = len(me) - knt1_updated
4542 IF (len(me) .EQ. 0) pe(me) = 0_8
4544 len(e) = ln - knt2_updated
4549 IF (len(e) .EQ. 0) pe(e) = 0_8
4556 pe(j) = int(iw(pn),8)
4566 IF (psrc .LE. pend)
THEN
4571 iw(pdst) = int(pe(j))
4576 DO 90 knt3 = 0, lenj - 2
4577 iw(pdst + knt3) = iw(psrc + knt3)
4579 pdst = pdst + lenj - 1
4580 psrc = psrc + lenj - 1
4586 DO 100 psrc = pme1, pfree - 1
4604 IF (degree(i).NE.n2)
THEN
4611 IF (inext .NE. 0) last(inext) = ilast
4612 IF (ilast .NE. 0)
THEN
4615 IF (wf(i).GT.norig)
THEN
4616 deg =
min(((wf(i)-norig)/pas) + norig , nbbuck)
4635 newmem = pfree - pme1
4637 maxmem =
max(maxmem, mem)
4645 len(me) = int(pme2 - pme1 + 1_8)
4650 IF (wflg .GT. maxint_n)
THEN
4652 IF (w(x) .NE. 0) w(x) = 1
4671 DO 150 pme = pme1, pme2
4674 IF (eln .GT. 0)
THEN
4678 DO 140 p = pe(i), pe(i) + int(eln - 1,8)
4681 IF (we .GE. wflg)
THEN
4684 ELSE IF (we .NE. 0)
THEN
4687 we = degree(e) + wnvi
4703 DO 180 pme = pme1, pme2
4706 p2 = p1 + elen(i) - 1
4720 IF (dext .GT. 0)
THEN
4721 IF ( wf(e) .EQ. 0 )
THEN
4726 wf(e) = dext * ( (2 * degree(e)) - dext - 1)
4732 hash = hash + int(e, kind=8)
4733 ELSE IF (dext .EQ. 0)
THEN
4737 hash = hash + int(e,kind=8)
4747 elen(i) = int(pn - p1 + 1_8)
4752 DO 170 p = p2 + 1_8, p1 + int(len(i) - 1,8)
4755 IF (nvj .GT. 0)
THEN
4762 hash = hash + int(j,kind=8)
4766 IF (degree(i).EQ.n2) deg = n2
4771 IF (elen(i).EQ.1 .AND. p3.EQ.pn)
THEN
4773 IF (deg .EQ. 0)
THEN
4795 IF (degree(i).NE.n2)
THEN
4797 IF ( degree(i).LT.deg )
THEN
4810 wf(i) = wf4 + 2*nvi*wf3
4821 len(i) = int(pn - p1 + 1)
4826 hash = mod(hash, hmod) + 1_8
4838 last(i) = int(hash,kind=kind
4846 dmax =
max(dmax, degme)
4849 IF (wflg .GT. maxint_n)
THEN
4851 IF (w(x) .NE. 0) w(x) = 1
4859 DO 250 pme = pme1, pme2
4861 IF ( (nv(i) .LT. 0) .AND. (degree(i).NE.n2) )
THEN
4868 hash = int(last(i),kind=8)
4871 IF (j .EQ. 0)
GO TO 250
4881 IF (i .EQ. 0)
GO TO 250
4884 IF (next(i) .NE. 0)
THEN
4893 DO 210 p = pe(i) + 1_8, pe(i) + int(ln - 1,8)
4908 IF (len(j) .NE. ln)
GO TO 240
4910 IF (elen(j) .NE. eln)
GO TO 240
4912 DO 230 p = pe(j) + 1_8, pe(j) + int(ln - 1,8)
4914 IF (w(iw(p)) .NE. wflg)
GO TO 240
4920 wf(i) =
max(wf(i),wf(j))
4924 nv(i) = nv(i) + nv(j)
4945 IF (i .NE. 0)
GO TO 200
4953 nleft = totel - nel + nleft_v1
4954 DO 260 pme = pme1, pme2
4957 IF (nvi .GT. 0)
THEN
4961 IF (degree(i).NE.n2)
THEN
4967 IF (degree(i) + degme .GT. nleft )
THEN
4970 rmf1 = dble(deg)*dble( (deg-1) + 2*degme )
4972 degree(i) = nleft - nvi
4974 rmf = dble(deg)*dble(deg-1)
4975 & - dble(degme-nvi)*dble(degme-nvi-1)
4976 rmf =
min(rmf, rmf1)
4979 degree(i) = degree(i) + degme - nvi
4981 rmf = dble(deg)*dble( (deg-1) + 2*degme )
4985 rmf = rmf / dble(nvi+1)
4987 IF (rmf.LT.dummy)
THEN
4988 wf(i) = int( anint( rmf ))
4989 ELSEIF (rmf / dble(n) .LT. dummy)
THEN
4990 wf(i) = int ( anint( rmf/dble(n) ))
4994 wf(i) =
max(1,wf(i))
4996 IF (deg.GT.norig)
THEN
4997 deg =
min(((deg-norig)/pas) + norig, nbbuck)
5000 IF (inext .NE. 0) last(inext) = i
5007 mindeg =
min(mindeg, deg)
5021 nv(me) = nvpiv + degme
5025 len(me) = int(p - pme1)
5026 IF (len(me) .EQ. 0)
THEN
5031 IF (newmem .NE. 0)
THEN
5036 mem = mem - newmem + int(len(me),8)
5044 IF (nel.LT.norig)
THEN
5053 DO deg = mindeg, nbbuck+1
5055 IF (me .GT. 0)
GO TO 51
5060 IF ((pe(x).GT.0) .AND. (elen(x).LT.0))
THEN
5064 ELSEIF (degree(x).EQ.n2)
THEN
5078 IF (nel.NE.norig)
THEN
5098 IF (elen(i) .EQ. 0)
THEN
5108 IF (elen(j) .GE. 0)
THEN
5126 IF (elen(j) .GE. 0)
THEN
5129 IF (elen(j) .EQ. 0)
THEN
5141 IF (compute_perm)
THEN
5169 IF(last(k) .NE. 0)
THEN
5176 IF (head(k-n) .NE. 0)
THEN
5203 parent(i) = int(pe(i))
5227 & (totel, compute_perm, iversion, thresh, ndense,
5228 & n, iwlen, pe, pfree, len, iw, nv,
5229 & elen, last, ncmpa, degree, head, next, w,
5232 INTEGER,
INTENT(IN) :: TOTEL, N
5233 LOGICAL,
INTENT(IN) :: COMPUTE_PERM
5234 INTEGER,
INTENT(IN) :: IVersion, THRESH
5235 INTEGER(8),
INTENT(IN) :: IWLEN
5236 INTEGER,
INTENT(INOUT) :: LEN(N), IW()
5237 INTEGER,
INTENT(OUT) :: NCMPA
5238 INTEGER,
INTENT(OUT) :: ELEN(), PARENT(N)
5239 INTEGER,
INTENT(OUT) :: LAST(N)
5240 INTEGER(8),
INTENT(INOUT) :: PFREE
5241 INTEGER(8),
INTENT(INOUT) :: PE(N)
5243 INTEGER,
INTENT(INOUT) :: NV(N)
5244 INTEGER,
INTENT(OUT) :: NEXT(N), DEGREE(N), HEAD(TOTEL), W(N)
5245 INTEGER,
INTENT(OUT) :: NDENSE(N)
5266 INTEGER THRESM, MINDEN, MAXDEN, NDME
5267 INTEGER NBD,NBED, NBDM, LASTD, NELME
5270 DOUBLE PRECISION RELDEN
5556 INTEGER :: DEG, DEGME, DEXT, DMAX, E, ELENME, ELN, I,
5557 & ILAST, INEXT, J, JLAST, JNEXT, K, , KNT2, KNT3,
5558 & LENJ, LN, ME, MINDEG, NEL,
5559 & NLEFT, NVI, NVJ, NVPIV, SLENME, WE, WFLG, WNVI, X
5560 INTEGER KNT1_UPDATED, KNT2_UPDATED
5561 INTEGER(8) MAXMEM, MEM, NEWMEM
5563 INTEGER(8):: HASH, HMOD
5606 INTEGER(8) P, P1, P2, P3, PDST, , PJ, PME, PME1, PME2,
5636 IF (thresh.GT.0)
THEN
5639 thresm =
max(thresm, len(i))
5641 relden = dble(pfree-1)/dble(n)
5643 thresm = int(relden)*10 + (thresm-int(relden))/10 + 1
5651 IF (thresm.GE.0)
THEN
5652 IF ((thresm.GT.totel).OR.(thresm.LT.2))
THEN
5662 maxint_n=huge(wflg)-n
5666 hmod = int(
max(1, n-1),kind=8)
5679 IF(nv(1) .LT. 0)
THEN
5687 DO p= pe(i) , pe(i)+int(len(i)-1,8)
5688 degree(i) = degree(i) + nv(iw(p))
5703 IF (deg .GT. 0)
THEN
5709 IF ( (thresm.GE.0) .AND.
5710 & (deg+nv(i).GE.thresm) )
THEN
5713 IF (deg+nv(i).NE.totel-nel)
THEN
5714 degree(i) = degree(i)+totel+1
5718 IF (inext .NE. 0) last(inext) = i
5722 IF (lastd.EQ.0) lastd=i
5728 IF (lastd.EQ.0)
THEN
5744 IF (inext .NE. 0) last(inext) = i
5762 IF (nbd.EQ.0) thresm = totel
5767 30
IF (nel .LT. totel)
THEN
5774 DO 40 deg = mindeg, totel
5776 IF (me .GT. 0)
GO TO 50
5779 IF (deg.LT.totel)
THEN
5784 IF (inext .NE. 0) last(inext) = 0
5787 nbdm =
max(nbdm,nbd)
5788 IF (degree(me).GT.totel+1)
THEN
5791 IF (wflg .GT. maxint_n)
THEN
5793 IF (w(x) .NE. 0) w(x) = 1
5803 IF (inext .NE. 0)
THEN
5815 p2 = p1 + int(len(me) -1,8)
5825 IF (w(e).EQ.wflg)
GOTO 55
5827 IF (pe(e).LT.0_8)
THEN
5831 IF (w(x) .EQ.wflg)
GOTO 55
5833 IF ( pe(x) .LT. 0_8 )
GOTO 53
5840 IF (elen(e).LT.0)
then
5842 ndense(e) = ndense(e) - nv(me)
5850 DO 54 pme = pme1, pme1+int(len(e)-1,8)
5852 IF ((elen(x).GE.0).AND.(w(x).NE.wflg))
THEN
5854 ndense(me) = ndense(me) + nv(x)
5860 ndense(me) = ndense(me) + nv(e)
5871 len(me) = int(pln-p1)
5872 elen(me) = int(peln-p1)
5873 ndme = ndense(me)+nv(me)
5874 minden =
min(minden, ndme)
5875 maxden =
max(maxden, ndme)
5879 IF (ndense(me).EQ.0) ndense(me) =1
5880 IF (iversion.EQ.1)
THEN
5886 deg =
max(degree(me)-(totel+1), 1)
5894 mindeg =
min(deg,mindeg)
5896 IF (jnext.NE. 0) last(jnext) = me
5904 IF (degree(me).GT.(totel+1) )
GOTO 51
5911 IF (iversion .EQ.1 )
THEN
5914 thresm=
max(thresm*2,minden+(maxden-minden)/2)
5916 thresm =
min(thresm,nbd)
5917 IF (thresm.GE.nbd) thresm=totel
5925 IF (degree(me).EQ.totel+1)
THEN
5928 IF (nbd.NE.nbed)
THEN
5929 write(6,*)
' Internal ERROR quasi dense rows remains'
5939 IF ((pe(x).GT.0_8) .AND. (elen(x).LT.0))
THEN
5943 ELSEIF (degree(x).EQ.totel+1)
THEN
5955 IF (nel.NE.totel)
THEN
5956 write(6,*)
'Internal ERROR 2 detected in QAMD'
5957 write(6,*)
' NEL not equal to N: N, NEL =',n,nel
5970 elen(me) = - (nel + 1)
5987 IF (elenme .EQ. 0)
THEN
5993 DO 60 p = pme1, pme1 + int(len(me) - 1,8)
5996 IF (nvi .GT. 0)
THEN
6010 IF (degree(i).LE.totel
THEN
6013 IF (inext .NE. 0) last(inext) = ilast
6014 IF (ilast .NE. 0)
THEN
6018 head(degree(i)) = inext
6021 ndense(me) = ndense(me) + nvi
6033 slenme = len(me) - elenme
6035 DO 120 knt1 = 1, elenme + 1
6036 knt1_updated = knt1_updated +1
6037 IF (knt1 .GT. elenme)
THEN
6057 knt2_updated = knt2_updated+1
6061 IF (nvi .GT. 0)
THEN
6065 IF (pfree .GT. iwlen)
THEN
6071 len(me) = len(me) - knt1_updated
6076 IF (len(me) .EQ. 0) pe(me) = 0_8
6078 len(e) = ln - knt2_updated
6083 IF (len(e) .EQ. 0) pe(e) = 0_8
6090 pe(j) = int(iw(pn),8)
6100 IF (psrc .LE. pend)
THEN
6105 iw(pdst) = int(pe(j))
6110 DO 90 knt3 = 0, lenj - 2
6111 iw(pdst + knt3) = iw(psrc + knt3)
6113 pdst = pdst + lenj - 1
6114 psrc = psrc + lenj - 1
6120 DO 100 psrc = pme1, pfree - 1
6142 IF (degree(i).LE.totel)
THEN
6145 IF (inext .NE. 0) last(inext) = ilast
6146 IF (ilast .NE. 0)
THEN
6150 head(degree(i)) = inext
6153 ndense(me) = ndense(me) + nvi
6166 newmem = pfree - pme1
6168 maxmem =
max(maxmem, mem)
6176 len(me) = int(pme2 - pme1 + 1_8)
6181 IF (wflg .GT. maxint_n)
THEN
6183 IF (w(x) .NE. 0) w(x) = 1
6202 DO 150 pme = pme1, pme2
6204 IF (degree(i).GT.totel)
GOTO 150
6206 IF (eln .GT. 0)
THEN
6210 DO 140 p = pe(i), pe(i) + int(eln - 1,8)
6213 IF (we .GE. wflg)
THEN
6216 ELSE IF (we .NE. 0)
THEN
6219 we = degree(e) + wnvi - ndense(e)
6234 DO 180 pme = pme1, pme2
6236 IF (degree(i).GT.totel)
GOTO 180
6238 p2 = p1 + int(elen(i) - 1,8)
6249 IF (dext .GT. 0)
THEN
6253 hash = hash + int(e,kind=8)
6258 ELSE IF (dext .EQ. 0)
THEN
6261 hash = hash + int(e,kind=8)
6268 ELSE IF ((dext .EQ. 0) .AND.
6269 & (ndense(me).EQ.nbd))
THEN
6275 ELSE IF (dext.EQ.0)
THEN
6278 hash = hash + int(e,kind=8)
6283 elen(i) = int(pn - p1 + 1)
6288 DO 170 p = p2 + 1, p1 + int(len(i) - 1,8)
6291 IF (nvj .GT. 0)
THEN
6295 IF (degree(j).LE.totel) deg=deg+nvj
6298 hash = hash + int(j,kind=8)
6305 IF (deg.EQ.0.AND.(ndense(me).EQ.nbd).AND.(elen(i).GT.1))
THEN
6310 p2 = p1 + int(elen(i),8) - 2_8
6319 IF ((deg .EQ. 0).AND.(ndense(me).EQ.nbd))
THEN
6340 degree(i) =
min(deg+nbd-ndense(me),
6352 len(i) = int(pn - p1 + 1)
6356 hash = mod(hash, hmod) + 1_8
6368 last(i) = int(hash,kind=kind(last))
6375 dmax =
max(dmax, degme)
6378 IF (wflg .GT. maxint_n)
THEN
6380 IF (w(x) .NE. 0) w(x) = 1
6388 DO 250 pme = pme1, pme2
6390 IF ( (nv(i).LT.0) .AND. (degree(i).LE.totel) )
THEN
6398 hash = int(last(i),kind=8)
6401 IF (j .EQ. 0)
GO TO 250
6411 IF (i .EQ. 0)
GO TO 250
6414 IF (next(i) .NE. 0)
THEN
6423 DO 210 p = pe(i) + 1, pe(i) + int(ln - 1,8)
6438 IF (len(j) .NE. ln)
GO TO 240
6440 IF (elen(j) .NE. eln)
GO TO 240
6442 DO 230 p = pe(j) + 1, pe(j) + int
6444 IF (w(iw(p)) .NE. wflg)
GO TO 240
6453 nv(i) = nv(i) + nv(j)
6474 IF (i .NE. 0)
GO TO 200
6483 DO 260 pme = pme1, pme2
6486 IF (nvi .GT. 0)
THEN
6490 IF (degree(i).LE.totel)
THEN
6494 deg =
min(degree(i)+ degme - nvi, nleft - nvi)
6498 IF ( (iversion .NE. 1).AND. (thresm.GE.0))
THEN
6508 IF (deg+nvi .GE. thresm)
THEN
6509 IF (thresm.EQ.totel)
THEN
6511 IF ((elen(i).LE.2) .AND. ((deg+nvi).EQ.nleft) )
THEN
6519 IF ((elen(i).LE.2).AND.((deg+nvi).EQ.nleft) )
THEN
6522 degree(i) = totel+1+degree(i
6530 p2 = p1 + int(elen(i) - 1,8)
6534 ndense (e) = ndense(e) + nvi
6540 IF (degree(i).EQ.totel+1)
THEN
6543 IF (lastd.EQ.0)
THEN
6558 IF (inext .NE. 0) last(inext) = i
6562 IF (lastd.EQ.0) lastd=i
6569 IF (.NOT.idense)
THEN
6574 IF (inext .NE. 0) last(inext) = i
6582 mindeg =
min(mindeg, deg)
6594 nv(me) = nvpiv + degme
6597 len(me) = int(p - pme1)
6598 IF (len(me) .EQ. 0)
THEN
6603 IF (newmem .NE. 0)
THEN
6608 mem = mem - newmem + int(len(me),8)
6630 IF (elen(i) .EQ. 0)
THEN
6640 IF (elen(j) .GE. 0)
THEN
6658 IF (elen(j) .GE. 0)
THEN
6661 IF (elen(j) .EQ. 0)
THEN
6673 IF (compute_perm)
THEN
6691 IF(last(k) .NE. 0)
THEN
6698 IF (head(k-n) .NE. 0)
THEN
6727 parent(i) = int(pe(i))
6743 & IWLEN, PE, PFREE, LEN, IW, NV, ELEN,
6744 & LAST, NCMPA, DEGREE, WF, NEXT, W, HEAD,
6745 & CONSTRAINT,THESON, PARENT)
6750 INTEGER,
INTENT(IN) :: N, NBBUCK
6751 INTEGER(8),
INTENT(IN) :: IWLEN
6753 INTEGER,
INTENT(INOUT) :: LEN(N), IW(IWLEN)
6755 INTEGER,
INTENT(INOUT) :: NV(N)
6758 INTEGER,
INTENT(OUT) ::
6759 INTEGER,
INTENT(OUT) :: ELEN(N), LAST(N), PARENT(N)
6762 INTEGER(8),
INTENT(INOUT) :: PFREE
6763 INTEGER(8),
INTENT(INOUT) :: PE(N)
6768 INTEGER :: NEXT(N), DEGREE(N), W(N)
6769 INTEGER :: HEAD(0:NBBUCK+1), WF(N)
6884 INTEGER,
INTENT(INOUT) :: (N)
6885 INTEGER,
INTENT(out) :: THESON(N)
7147 INTEGER :: DEG, DEGME, DEXT, DMAX, E, ELENME, ELN, I,
7148 & ILAST, INEXT, J, JLAST, JNEXT, K, KNT1, KNT2, KNT3,
7149 & LENJ, LN, ME, MINDEG, NEL,
7150 & NLEFT, NVI, NVJ, NVPIV, SLENME, WE, WFLG, WNVI, X,
7151 & NBFLAG, NREAL, LASTD, NELME, WF3, WF4, N2, PAS
7152 INTEGER KNT1_UPDATED, KNT2_UPDATED
7153 INTEGER(8) :: MAXMEM, MEM, NEWMEM
7155 INTEGER(8):: HASH, HMOD
7156 DOUBLE PRECISION :: RMF, RMF1
7157 DOUBLE PRECISION :: dummy
7211 INTEGER(8) P, P1, P2, P3, PDST, PEND, PJ, PME, PME1, PME2,
7233 INTRINSIC max,
min, mod, huge
7243 idummy = huge(idummy) - 1
7244 dummy = dble(idummy)
7254 maxint_n=huge(wflg)-n
7257 hmod = int(
max(1, nbbuck-1),kind=8)
7265 head(0:nbbuck+1) = 0
7275 IF (len(i).LT.0)
THEN
7278 IF (len(i).EQ.-n-1)
THEN
7289 totel = totel + nv(i)
7291 DO p= pe(i) , pe(i)+int(len(i)-1,8)
7292 degree(i) = degree(i) + nv(iw(p))
7312 IF (lastd.EQ.0)
THEN
7328 IF (deg .GT. 0)
THEN
7331 deg =
min(((deg-n)/pas) + n , nbbuck)
7340 IF (inext .NE. 0) last(inext) = i
7362 30
IF (nel .LT. totel)
THEN
7369 DO 40 deg = mindeg, nbbuck
7371 IF (me .GT. 0)
GO TO 50
7388 IF(constraint(me) .LT. 0)
THEN
7394 IF(constraint(j) .GE. 0)
THEN
7395 IF (wf(j).LT.k .OR. k .LT. 0)
THEN
7405 IF (inext .NE. 0) last(inext) = ilast
7406 IF (ilast .NE. 0)
THEN
7416 IF(constraint(me) .GE. 0)
GOTO 59
7419 IF(next(me) .NE. 0)
THEN
7421 IF(constraint(me) .GE. 0)
THEN
7434 IF(constraint(me) .GE. 0)
THEN
7447 IF(prev .NE. 0)
THEN
7453 IF (inext .NE. 0) last(inext) = prev
7459 5910
IF(toto .NE. 0)
THEN
7460 j = constraint(toto)
7474 elen(me) = - (nel + 1)
7490 IF (elenme .EQ. 0)
THEN
7496 DO 60 p = pme1, pme1 + len(me) - 1
7499 IF (nvi .GT. 0)
THEN
7509 IF (degree(i).NE.n2)
THEN
7515 IF (inext .NE. 0) last(inext) = ilast
7516 IF (ilast .NE. 0)
THEN
7520 IF (wf(i).GT.n)
THEN
7521 deg =
min(((wf(i)-n)/pas) + n , nbbuck)
7538 slenme = len(me) - elenme
7540 DO 120 knt1 = 1, elenme + 1
7541 knt1_updated = knt1_updated +1
7542 IF (knt1 .GT. elenme)
THEN
7562 knt2_updated = knt2_updated+1
7566 IF (nvi .GT. 0)
THEN
7570 IF (pfree .GT. iwlen)
THEN
7576 len(me) = len(me) - knt1_updated
7581 IF (len(me) .EQ. 0) pe(me) = 0_8
7583 len(e) = ln - knt2_updated
7588 IF (len(e) .EQ. 0) pe(e) = 0_8
7595 pe(j) = int(iw(pn),8)
7605 IF (psrc .LE. pend)
THEN
7610 iw(pdst) = int(pe(j))
7615 DO 90 knt3 = 0, lenj - 2
7616 iw(pdst + knt3) = iw(psrc + knt3)
7618 pdst = pdst + int(lenj - 1,8)
7619 psrc = psrc + int(lenj - 1,8)
7625 DO 100 psrc = pme1, pfree - 1
7643 IF (degree(i).NE.n2)
THEN
7650 IF (inext .NE. 0) last(inext) = ilast
7651 IF (ilast .NE. 0)
THEN
7654 IF (wf(i).GT.n)
THEN
7655 deg =
min(((wf(i)-n)/pas)
7676 maxmem =
max(maxmem, mem)
7684 len(me) = int(pme2 - pme1 + 1_8)
7689 IF (wflg .GT. maxint_n)
THEN
7691 IF (w(x) .NE. 0) w(x) = 1
7710 DO 150 pme = pme1, pme2
7713 IF (eln .GT. 0)
THEN
7717 DO 140 p = pe(i), pe(i) + int(eln - 1,8)
7720 IF (we .GE. wflg)
THEN
7723 ELSE IF (we .NE. 0)
THEN
7726 we = degree(e) + wnvi
7742 DO 180 pme = pme1, pme2
7745 p2 = p1 + int(elen(i) - 1,8)
7759 IF (dext .GT. 0)
THEN
7760 IF ( wf(e) .EQ. 0 )
THEN
7765 wf(e) = dext * ( (2 * degree(e)) - dext - 1)
7771 hash = hash + int(e,kind=8)
7772 ELSE IF (dext .EQ. 0)
THEN
7776 hash = hash + int(e,kind=8)
7786 elen(i) = int(pn - p1 + 1_8)
7791 DO 170 p = p2 + 1, p1 + int(len(i) - 1,8)
7794 IF (nvj .GT. 0)
THEN
7801 hash = hash + int(j,kind=8)
7805 IF (degree(i).EQ.n2) deg = n2
7810 IF (elen(i).EQ.1 .AND. p3.EQ.pn)
THEN
7812 IF (deg .EQ. 0)
THEN
7822 5911
IF(toto .NE. 0)
THEN
7823 j = constraint(toto)
7844 IF (degree(i).NE.n2)
THEN
7847 IF ( degree(i).LT.deg )
THEN
7860 wf(i) = wf4 + 2*nvi*wf3
7871 len(i) = int(pn - p1 + 1_8)
7876 hash = mod(hash, hmod) + 1_8
7888 last(i) = int(hash,kind=kind(last))
7896 dmax =
max(dmax, degme)
7899 IF (wflg .GT. maxint_n)
THEN
7901 IF (w(x) .NE. 0) w(x) = 1
7909 DO 250 pme = pme1, pme2
7911 IF ( (nv(i) .LT. 0) .AND. (degree(i).NE.n2) )
THEN
7918 hash = int(last(i),kind=8)
7921 IF (j .EQ. 0)
GO TO 250
7931 IF (i .EQ. 0)
GO TO 250
7934 IF (next(i) .NE. 0)
THEN
7943 DO 210 p = pe(i) + 1, pe(i) + int(ln - 1,8)
7954 IF(constraint(j) .LT. 0
7955 & .AND. constraint(i) .LT. 0)
THEN
7958 IF(constraint(i) .GE. 0)
THEN
7959 IF(constraint(j) .LT. 0)
THEN
7961 221
IF(toto .NE. 0)
THEN
7962 IF(constraint(toto) .EQ. j)
THEN
7973 IF(constraint(j) .GE. 0)
THEN
7975 222
IF(toto .NE. 0)
THEN
7976 IF(constraint(toto) .EQ. i)
THEN
7990 IF (len(j) .NE. ln)
GO TO 240
7992 IF (elen(j) .NE. eln)
GO TO 240
7994 DO 230 p = pe(j) + 1_8, pe(j) + int(ln - 1,8)
7996 IF (w(iw(p)) .NE. wflg)
GO TO 240
8003 231
IF(theson(toto) .NE. 0)
THEN
8008 IF(constraint(i) .LT. 0)
THEN
8012 wf(i) =
max(wf(i),wf(j))
8016 nv(i) = nv(i) + nv(j)
8037 IF (i .NE. 0)
GO TO 200
8046 DO 260 pme = pme1, pme2
8049 IF (nvi .GT. 0)
THEN
8053 IF (degree(i).NE.n2)
THEN
8057 deg =
min(degree(i) + degme - nvi, nleft - nvi)
8058 IF (degree(i) + degme .GT. nleft )
THEN
8061 rmf1 = dble(deg)*dble( (deg-1) + 2*degme )
8063 degree(i) = nleft - nvi
8065 rmf = dble(deg)*dble(deg-1)
8066 & - dble(degme-nvi)*dble(degme-nvi-1)
8067 rmf =
min(rmf, rmf1)
8070 degree(i) = degree(i) + degme - nvi
8071 rmf = dble(deg)*dble( (deg-1) + 2*degme )
8074 rmf = rmf / dble(nvi+1)
8076 IF (rmf.LT.dummy)
THEN
8077 wf(i) = int( anint( rmf ))
8078 ELSEIF (rmf / dble(n) .LT. dummy)
THEN
8079 wf(i) = int( anint( rmf/dble(n) ))
8083 wf(i) =
max(1,wf(i))
8089 deg =
min(((deg-n)/pas) + n , nbbuck)
8092 IF (inext .NE. 0) last(inext) = i
8099 mindeg =
min(mindeg, deg)
8111 nv(me) = nvpiv + degme
8115 len(me) = int(p - pme1)
8116 IF (len(me) .EQ. 0)
THEN
8121 IF (newmem .NE. 0)
THEN
8126 mem = mem - newmem + int(len(me),8)
8134 IF (nbflag.GT.0)
THEN
8143 DO deg = mindeg, nbbuck+1
8145 IF (me .GT. 0)
GO TO 51
8150 IF ((pe(x).GT.0_8) .AND. (elen(x).LT.0))
THEN
8154 ELSEIF (degree(x).EQ.n2)
THEN
8185 IF (elen(i) .EQ. 0)
THEN
8195 IF (elen(j) .GE. 0)
THEN
8213 IF (elen(j) .GE. 0)
THEN
8216 IF (elen(j) .EQ. 0)
THEN
8254 IF(last(k) .NE. 0)
THEN
8261 IF (degree(k-n) .NE. 0)
THEN
8286 parent(i) = int(pe(i))
8299 & n, totel, iwlen, pe, pfree, len, iw, nv,
8300 & elen, last, ncmpa, degree, head, next, w,
8301 & perm, listvar_schur, size_schur,
8305 INTEGER,
INTENT(IN) :: N, TOTEL, SIZE_SCHUR
8306 LOGICAL,
INTENT(IN) :: AGG6
8307 INTEGER,
INTENT(IN) :: THRESH
8308 INTEGER(8),
INTENT(IN) :: IWLEN
8309 INTEGER,
INTENT(IN) :: LISTVAR_SCHUR(max(1,SIZE_SCHUR))
8311 INTEGER,
INTENT(INOUT) :: LEN(), IW(IWLEN)
8314 INTEGER,
INTENT(OUT) :: NCMPA
8315 INTEGER,
INTENT(OUT) :: ELEN(N), LAST(TOTEL), PARENT(N)
8318 INTEGER,
INTENT(INOUT) :: NV(N)
8319 INTEGER(8),
INTENT(INOUT) :: PFREE
8320 INTEGER(8),
INTENT(INOUT) :: PE(N)
8321 INTEGER,
INTENT(INOUT) :: PERM(N)
8324 INTEGER,
INTENT(OUT) :: NDENSE(N), DEGREE(N),
8325 & head(totel), next(n), w(n)
8465 INTEGER THRESM, NDME, PERMeqN
8466 INTEGER NBD,NBED, NBDM, LASTD, NELME
8724 INTEGER :: FDEG, ThresMin, ThresPrev, IBEGSchur, NbSchur,
8726 INTEGER :: DEGMAX,THD, THDperm, THD_AGG
8727 DOUBLE PRECISION :: RELDEN
8728 LOGICAL :: AGG6_loc, DenseRows
8730 INTEGER :: DEG, DEGME, DEXT, DMAX, E, ELENME, ELN, I,
8731 & ilast, inext, j, jlast, jnext, k, knt1, knt2, knt3,
8732 & lenj, ln, me, mindeg, nel,
8733 & nleft, nvi, nvj, nvpiv, slenme, we, wflg, wnvi, x
8734 INTEGER KNT1_UPDATED, KNT2_UPDATED
8735 INTEGER :: SIZE_SCHUR_LOC
8736 INTEGER(8) MAXMEM, MEM, NEWMEM
8738 INTEGER(8) :: HASH, HMOD
8782 INTEGER(8) P, P1, P2, P3, PDST, PEND, PJ, PME, PME1, PME2,
8783 & PN, PSRC, PLN, PELN
8804 INTRINSIC max,
min, mod, maxval
8812 IF (nv(1).LT.0) nv(1) = 1
8824 size_schur_loc = size_schur
8825 size_schur_loc =
min(n,size_schur_loc)
8826 size_schur_loc = max(0,size_schur_loc)
8827 schuron = (size_schur_loc > 0)
8828 ibegschur = n-size_schur_loc+1
8830 IF (thresm.GT.n) thresm = n
8831 IF (thresm.LT.0) thresm = 0
8836 IF ( perm(i) .GE. ibegschur)
THEN
8840 IF (len(i) .EQ.0)
THEN
8859 thresm = max(int(31*n/32),thresm)
8860 thresm = max(thresm,1)
8863 relden=dble(pfree-1)/dble(n)
8864 thd = int(relden)*10 + (degmax-int(relden))/10 + 1
8865 IF (thd.LT.degmax)
THEN
8869 IF (len(i) .GT. thd)
THEN
8870 thdperm =
min(thdperm,perm(i))
8873 thresm =
min(thresm, thdperm)
8876 thresmin = max( 3*thresm / 4, 1)
8881 thresmininit = thresmin/4
8882 thd_agg = max(128,
min(totel/2048, 1024))
8883 IF (thresm.GT.0)
THEN
8884 IF ((thresm.GT.n).OR.(thresm.LT.2))
THEN
8894 maxint_n=huge(wflg)-totel
8898 hmod = int(max(1, n-1),kind=8)
8914 IF(nv(1) .LT. 0)
THEN
8922 DO p= pe(i) , pe(i)+int(len(i)-1,8)
8923 degree(i) = degree(i) + nv(iw(p))
8937 IF (perm(i).EQ.n)
THEN
8943 IF ( (deg .GT. 0).OR.(perm(i).EQ.n+1) )
THEN
8949 IF ( (thresm.GT.0) .AND.
8950 & (fdeg .GT.thresm) )
THEN
8953 IF (fdeg.NE.n+1)
THEN
8955 degree(i) = degree(i)+totel+2
8959 IF (inext .NE. 0) last(inext) = i
8963 IF (lastd.EQ.0) lastd=i
8972 IF (lastd.EQ.0)
THEN
8988 IF (inext .NE. 0) last(inext) = i
9005 IF ((nbd.EQ.0).AND.(thresm.GT.0)) thresm = n
9010 30
IF (nel .LT. totel)
THEN
9017 DO 40 deg = mindeg, n
9019 IF (me .GT. 0)
GO TO 50
9029 IF ( (deg.NE.n) .AND.
9030 & (deg.GT.thresm+1) .AND. (nbd.GT.0) )
THEN
9034 IF (degree(me).LE.totel)
THEN
9039 IF (inext .NE. 0) last(inext) = 0
9048 nbdm = max(nbdm,nbd)
9049 IF (degree(me).GT.totel+1)
THEN
9050 IF (wflg .GT. maxint_n)
THEN
9052 IF (w(x) .NE. 0) w(x) = 1
9062 IF (inext .NE. 0)
THEN
9074 p2 = p1 + int(len(me) -1,8)
9084 IF (w(e).EQ.wflg)
GOTO 55
9086 IF (pe(e).LT.0_8)
THEN
9090 IF (w(x) .EQ.wflg)
GOTO 55
9092 IF ( pe(x) .LT. 0_8 )
GOTO 53
9099 IF (elen(e).LT.0)
THEN
9101 ndense(e) = ndense(e) - nv(me)
9109 DO 54 pme = pme1, pme1+int(len(e)-1,8)
9111 IF ((elen(x).GE.0).AND.(w(x).NE.wflg))
THEN
9113 ndense(me) = ndense(me) + nv(x)
9119 ndense(me) = ndense(me) + nv(e)
9130 len(me) = int(pln-p1)
9131 elen(me) = int(peln-p1)
9132 ndme = ndense(me)+nv(me)
9133 IF (ndense(me).EQ.0) ndense(me) =1
9137 degree(me) = ndense(me)
9139 mindeg =
min(deg,mindeg)
9141 IF (jnext.NE. 0) last(jnext) = me
9149 IF (degree(me).GT.(totel+1) )
GOTO 51
9155 IF (thresm.LT.n)
THEN
9156 thresmin = max(thresm+thresmin,thresprev+thresmin/2+1)
9157 thresmin =
min(thresmin, n)
9158 thresprev = thresprev+(n-thresprev)/2+thresmininit
9160 & thresm + int(sqrt(dble(thresmin)))+ thresmininit ,
9162 thresm =
min(thresm,n)
9163 thresmin =
min(thresm, thresmin)
9173 IF (degree(me).EQ.totel+1)
THEN
9176 IF (nbd.NE.nbed)
THEN
9177 write(6,*)
' ERROR in MUMPS_SYMQAMD quasi dense rows remains'
9183 IF ((pe(x).GT.0) .AND. (elen(x).LT.0))
THEN
9184 pe(x) = int(-listvar_schur(1),8)
9185 ELSE IF ((pe(x).GT.0) .AND. (elen(x).LT.0))
THEN
9188 pe(x) = int(-listvar_schur(1),8)
9190 ELSEIF (degree(x).EQ.totel+1)
THEN
9196 nbschur = nbschur+ 1
9199 IF (nbschur.NE.size_schur_loc)
then
9200 write(6,*)
' Internal error 2 in QAMD :',
9201 &
' Schur size expected:',size_schur_loc,
'Real:', nbschur
9209 write(6,*)
'Internal ERROR 2 detected in QAMD'
9210 write(6,*)
' NEL not equal to N: N, NEL =',n
9213 IF (me.NE. listvar_schur(1))
THEN
9215 DO i=1, size_schur_loc
9216 pe(listvar_schur(i)) = int(-listvar_schur(1),8)
9218 pe(listvar_schur(1)) = 0_8
9219 nv( listvar_schur(1))= nv(me)
9221 elen( listvar_schur(1)) = elen(me)
9234 elen(me) = - (nel + 1)
9251 IF (elenme .EQ. 0)
THEN
9257 DO 60 p = pme1, pme1 + int(len(me) - 1,8)
9260 IF (nvi .GT. 0)
THEN
9274 IF (degree(i).LE.totel)
THEN
9277 IF (inext .NE. 0) last(inext) = ilast
9278 IF (ilast .NE. 0)
THEN
9282 head(perm(i)) = inext
9285 ndense(me) = ndense(me) + nvi
9297 slenme = len (me) - elenme
9299 DO 120 knt1 = 1, elenme + 1
9300 knt1_updated = knt1_updated +1
9301 IF (knt1 .GT. elenme)
THEN
9321 knt2_updated = knt2_updated+1
9325 IF (nvi .GT. 0)
THEN
9329 IF (pfree .GT. iwlen)
THEN
9335 len(me) = len(me) - knt1_updated
9340 IF (len(me) .EQ. 0) pe(me) = 0
9342 len(e) = ln - knt2_updated
9347 IF (len(e) .EQ. 0) pe(e) = 0
9364 IF (psrc .LE. pend)
THEN
9369 iw(pdst) = int(pe(j))
9374 DO 90 knt3 = 0, lenj - 2
9375 iw(pdst + knt3) = iw(psrc + knt3)
9377 pdst = pdst + lenj - 1
9378 psrc = psrc + lenj - 1
9384 DO 100 psrc = pme1, pfree - 1
9406 IF (degree(i).LE.totel)
THEN
9409 IF (inext .NE. 0) last(inext) = ilast
9410 IF (ilast .NE. 0)
THEN
9414 head(perm(i)) = inext
9417 ndense(me) = ndense(me) + nvi
9430 newmem = pfree - pme1
9432 maxmem = max (maxmem, mem)
9440 len(me) = int(pme2 - pme1 + 1_8)
9445 IF (wflg .GT. maxint_n)
THEN
9447 IF (w(x) .NE. 0) w(x) = 1
9472 DO 150 pme = pme1, pme2
9474 IF (degree(i).GT.totel)
GOTO 150
9476 IF (eln .GT. 0)
THEN
9480 DO 140 p = pe(i), pe(i) + int(eln - 1,8)
9483 IF (we .GE. wflg)
THEN
9486 ELSE IF (we .NE. 0)
THEN
9489 we = degree(e) + wnvi - ndense(e)
9505 agg6_loc = (agg6 .OR. (degree(me) .LT. thd_agg))
9506 DO 180 pme = pme1, pme2
9508 IF (degree(i).GT.totel)
GOTO 180
9510 p2 = p1 + int(elen (i) - 1,8)
9521 IF (dext .GT. 0)
THEN
9525 hash = hash + int(e,kind=8)
9529 ELSE IF (.NOT. agg6_loc .AND. dext .EQ. 0)
THEN
9532 hash = hash + int(e,kind=8)
9537 ELSE IF (agg6_loc .AND. (dext .EQ. 0) .AND.
9538 & ((ndense(me).EQ.nbd).OR.(ndense(e).EQ.0)))
THEN
9544 ELSE IF (agg6_loc .AND. dext.EQ.0)
THEN
9547 hash = hash + int(e,kind=8)
9551 elen(i) = int(pn - p1 + 1)
9556 DO 170 p = p2 + 1, p1 + int(len(i) - 1,8)
9559 IF (nvj .GT. 0)
THEN
9563 IF (degree(j).LE.totel) deg=deg+nvj
9566 hash = hash + int(j,kind=8)
9572 IF (((elen(i).EQ.1).AND.(p3.EQ.pn))
9574 & (agg6_loc.AND.(deg .EQ. 0).AND.(ndense(me).EQ.nbd))
9597 degree(i) =
min(deg+nbd-ndense(me),
9609 len(i) = int(pn - p1 + 1)
9613 hash = mod(hash, hmod) + 1_8
9625 last(i) = int(hash,kind=kind(last))
9632 dmax = max(dmax, degme)
9635 IF (wflg .GT. maxint_n)
THEN
9637 IF (w(x) .NE. 0) w(x) = 1
9645 DO 250 pme = pme1, pme2
9647 IF ( (nv(i).LT.0) .AND. (degree(i).LE.totel) )
THEN
9655 hash = int(last(i),kind=8)
9658 IF (j .EQ. 0)
GO TO 250
9668 IF (i .EQ. 0)
GO TO 250
9671 IF (next(i) .NE. 0)
THEN
9681 DO 210 p = pe(i) + 1, pe(i) + int(ln - 1,8)
9696 IF (len(j) .NE. ln)
GO TO 240
9698 IF (elen(j) .NE. eln)
GO TO 240
9700 DO 230 p = pe(j) + 1, pe(j) + int(ln - 1,8)
9702 IF (w(iw(p)) .NE. wflg)
GO TO 240
9707 IF (perm(j).GT.perm(x))
THEN
9710 nv(x) = nv(x) + nv(j)
9716 nv(j) = nv(x) + nv(j)
9742 IF (i .NE. 0)
GO TO 200
9753 IF ( .NOT.denserows.AND.(thresm .GT. 0).AND.(thresm.LT.n) )
9755 thresm = max(thresmin, thresm-nvpiv)
9759 DO 260 pme = pme1, pme2
9762 IF (nvi .GT. 0)
THEN
9766 IF (degree(i).LE.totel)
THEN
9770 deg =
min(degree(i)+ degme - nvi, nleft - nvi)
9777 IF (thresm.GT.0)
THEN
9778 IF (perm(i) .GT. thresm)
THEN
9782 degree(i) = degree(i)+totel+2
9788 p2 = p1 + int(elen(i) - 1,8)
9792 ndense(e) = ndense(e) + nvi
9801 IF (inext .NE. 0) last(inext) = i
9805 IF (lastd.EQ.0) lastd=i
9811 IF (.NOT.idense)
THEN
9817 IF (inext .NE. 0) last(inext) = i
9825 mindeg =
min(mindeg, fdeg)
9837 nv(me) = nvpiv + degme
9840 len(me) = int(p - pme1)
9841 IF (len(me) .EQ. 0)
THEN
9846 IF (newmem .NE. 0)
THEN
9851 mem = mem - newmem + int(len(me),8)
9873 IF (elen(i) .EQ. 0)
THEN
9883 IF (elen(j) .GE. 0)
THEN
9901 IF (elen(j) .GE. 0)
THEN
9904 IF (elen(j) .EQ. 0)
THEN
9926 IF (.NOT.schuron)
THEN
9944 parent(i) = int(pe(i))