16 & IORD, NFSIZ, FILS, FRERE,
17 & LISTVAR_SCHUR, SIZE_SCHUR,
18 & ICNTL, INFO, KEEP,KEEP8,
27 INTEGER,
INTENT(IN) :: N, NELT, SIZE_SCHUR, NSLAVES, LIW
28 INTEGER,
INTENT(IN) :: ELTPTR(NELT+1)
29 INTEGER,
INTENT(IN) :: ELTVAR(ELTPTR(NELT+1)-1)
30 INTEGER,
INTENT(IN) :: LISTVAR_SCHUR(SIZE_SCHUR)
31 INTEGER,
INTENT(IN) :: ICNTL(60)
32 INTEGER,
INTENT(INOUT) :: IORD
33 INTEGER,
INTENT(INOUT) :: (N,3)
34 INTEGER,
INTENT(INOUT) :: INFO(80), KEEP(500)
35 INTEGER(8)INTENT(INOUT)
36INTEGER,
INTENT(OUT) :: NFSIZ(), FILS(N), FRERE(N)
37 INTEGER,
INTENT(OUT) :: XNODEL(N+1), NODEL(ELTPTR(NELT+1)-1)
38#if defined(metis) || defined(parmetis) || defined(metis4) || defined(parmetis3)
39 INTEGER,
INTENT(IN) :: METIS_OPTIONS(40)
41 INTEGER K,I,L1,L2,NCMPA,IFSON,IN
42 INTEGER NEMIN, MPRINT, LP, MP, LDIAG
43 INTEGER(8) :: NZ8, LLIW8, IWFR8
44 INTEGER allocok, ITEMP
45 LOGICAL PROK, NOSUPERVAR, LPOK
47 PARAMETER(K79REF=12000000_8)
49 INTEGER,
PARAMETER :: LIDUMMY = 1
51 INTEGER,
DIMENSION(:),
ALLOCATABLE :: IW
52 INTEGER,
DIMENSION(:),
ALLOCATABLE :: IW2
53 INTEGER,
DIMENSION(:),
ALLOCATABLE :: PARENT
54 INTEGER,
DIMENSION(:,:),
ALLOCATABLE :: IWtemp
55 INTEGER(8),
DIMENSION(:),
ALLOCATABLE :: IPE8
56#if defined(metis) || defined(parmetis) || defined(metis4) || defined(parmetis3)
57#if defined(metis4) || defined(parmetis3)
60 INTEGER,
DIMENSION(:),
ALLOCATABLE :: NUMFLAG
62 INTEGER :: OPT_METIS_SIZE, METIS_IDX_SIZE
66 EXTERNAL DMUMPS_ANA_G11_ELT, DMUMPS_ANA_G12_ELT,
76 ALLOCATE( iw( liw ), stat = allocok )
77 IF ( allocok .GT. 0 )
THEN
82 ALLOCATE( ipe8( n + 1 ), stat = allocok )
83 IF ( allocok .GT. 0 )
THEN
85 info( 2 ) = (n+1)*keep(10)
88 ALLOCATE( parent(n), iwtemp( n, 3 ), stat = allocok )
89 IF ( allocok .GT. 0 )
THEN
96 lpok = ((lp.GT.0).AND.(icntl(4).GE.1))
98 prok = ((mp.GT.0).AND.(icntl(4).GE.2))
100 IF (keep(60).NE.0)
THEN
102 IF (iord.GT.1) iord = 0
107 IF ( n < 10000 )
THEN
110#if defined(metis) || defined(parmetis) || defined(metis4) || defined(parmetis3)
117#if ! defined(metis) && ! defined(parmetis) && ! defined(metis4) && ! defined(parmetis3)
118 IF (iord == 5) iord = 0
120 IF (keep(1).LT.1) keep(1) = 1
122 IF (ldiag.LE.2 .OR. mp.LE.0)
GO TO 10
123 WRITE (mp,99999) n, nelt, liw, info(1)
125 IF (ldiag.EQ.4) k = nelt+1
126 IF (k.GT.0)
WRITE (mp,99998) (eltptr(i),i=1,k)
127 k = min0(10,eltptr(nelt+1)-1)
128 IF (ldiag.EQ.4) k = eltptr(nelt+1)-1
129 IF (k.GT.0)
WRITE (mp,99995) (eltvar(i),i=1,k)
131 IF (ldiag.EQ.4) k = n
132 IF (iord.EQ.1 .AND. k.GT.0)
THEN
133 WRITE (mp,99997) (ikeep(i,1),i=1,k)
137 IF (liw .LT. 3*n)
THEN
141#if defined(metis) || defined(parmetis) || defined(metis4) || defined(parmetis3)
142 IF ( iord == 5 )
THEN
143 IF (liw .LT. n+n+1)
THEN
151 IF ( liw .LT. 2*n )
THEN
157 IF ( liw .LT. 4*n+4 )
THEN
163#if defined(metis) || defined(parmetis) || defined(metis4) || defined(parmetis3)
167 CALL dmumps_nodel(nelt, n, eltptr(nelt+1)-1, eltptr, eltvar,
168 & xnodel, nodel, iw(l1), idum, icntl)
169 IF (iord.NE.1 .AND. iord .NE. 5)
THEN
173 & eltptr, eltvar, xnodel, nodel,
174 & iwtemp(1,2), iw(l1))
176 CALL dmumps_ana_g11_elt(n, nz8, nelt, eltptr(nelt+1)-1,
177 & eltptr, eltvar, xnodel, nodel,
178 & iwtemp(1,2), 4*n+4, iw(l1))
180 lliw8 =
max(nz8,int(n,8))
181 ALLOCATE( iw2(lliw8), stat = allocok )
182 IF (allocok.GT.0)
THEN
189 & eltptr, eltvar, xnodel, nodel,
190 & iw2, lliw8, ipe8, iwtemp(1,2),
193 CALL dmumps_ana_g12_elt(n, nelt, eltptr(nelt+1)-1,
194 & eltptr, eltvar, xnodel, nodel,
195 & iw2, lliw8, ipe8, iwtemp(1,2),
199 CALL mumps_hamd(n, lliw8, ipe8, iwfr8, iwtemp(1,2), iw2,
201 & ikeep(1,2), ncmpa, fils, ikeep(1,3), iw(l2), iwtemp(1,3),
203 & listvar_schur, size_schur)
204 IF (keep(60) == 1)
THEN
205 keep(20) = listvar_schur(1)
206 ELSEIF (keep(60) == 2 .OR. keep(60) == 3 )
THEN
207 keep(38) = listvar_schur(1)
209 WRITE(*,*)
"Internal error in DMUMPS_ANA_F_ELT",keep(60)
215 & ikeep(1,2), ncmpa, fils, ikeep(1,3), iw(l2), iwtemp(1,3),
219#if defined(metis) || defined(parmetis) || defined(metis4) || defined(parmetis3)
222 WRITE(mprint,
'(A)')
' Ordering based on METIS'
225 & eltptr, eltvar, xnodel, nodel,
226 & iwtemp(1,2), iw(l1))
227 lliw8 =
max(nz8,int(n,8))
228 ALLOCATE( iw2(lliw8), stat = allocok )
229 IF (allocok.GT.0)
THEN
235 & eltptr, eltvar, xnodel, nodel,
236 & iw2, lliw8, ipe8, iwtemp(1,2),
238#if defined(metis4) || defined(parmetis3)
242 ALLOCATE( numflag( n ), stat = ierr )
243 IF ( ierr .GT. 0 )
THEN
253 CALL mumps_metis_idxsize(metis_idx_size)
254 IF (keep(10).EQ.1.AND.metis_idx_size.NE.64)
THEN
259 IF (metis_idx_size .EQ. 32)
THEN
260 CALL mumps_metis_nodend_mixedto32(n, ipe8, iw2,
261#if defined(metis4) || defined(parmetis3)
266 & metis_options(1), opt_metis_size,
267 & ikeep(1:n,2), ikeep(1:n,1), info(1), lp, lpok)
268 ELSE IF (metis_idx_size .EQ. 64)
THEN
269 CALL mumps_metis_nodend_mixedto64(n, ipe8, iw2,
270#if defined(metis4) || defined(parmetis3)
275 & metis_options(1), opt_metis_size,
276 & ikeep(1:n,2), ikeep(1:n,1), info(1),
277 & lp, lpok, keep(10),
278 & lliw8, .false., .true. )
281 &
"Internal error in METIS wrappers, METIS_IDX_SIZE=",
285 IF (info(1) .LT. 0)
GOTO 90
287 ELSE IF (iord.NE.1)
THEN
289 WRITE(*,*)
'bad option for ordering'
297 IF ((ikeep(k,1).LE.0).OR.(ikeep(k,1).GT.n))
299 IF (iw(l1+ikeep(k,1)).EQ.1)
THEN
302 iw(l1+ikeep(k,1)) = 1
306 & eltptr, eltvar, xnodel, nodel,
307 & ikeep, iwtemp(1,2), iw(l1))
309 ALLOCATE( iw2(lliw8), stat = allocok )
310 IF (allocok.GT.0)
THEN
316 & eltptr, eltvar, xnodel, nodel,
317 & ikeep, iw2, lliw8, ipe8, iwtemp(1,2),
319 IF (keep(60) == 0)
THEN
323 IF (keep(60) == 1)
THEN
324 keep(20) = listvar_schur(1)
325 ELSEIF (keep(60) == 2 .OR. keep(60) == 3 )
THEN
326 keep(38) = listvar_schur(1)
328 WRITE(*,*)
"Internal error in DMUMPS_ANA_F_ELT",keep(60)
333 & ikeep(1,2), iw(l1),
334 & iw(l2), ncmpa, itemp, iwtemp)
337 CALL dmumps_ana_l(n, iwtemp, iw(l1), ikeep, ikeep(1,2),
339 & nfsiz, info(6), fils, frere, iwtemp(1,3), nemin, keep(60))
343 & nfsiz, iwtemp(1,2),
344 & info(6), fils, frere, iwtemp(1,3), nemin,
345 & iw(l2), keep(60), keep(20), keep(38),
346 & iw2,keep(104),iw(l2+n),keep(50),
347 & icntl(13), keep(37), keep(197), nslaves, keep(250).EQ.1,
348 & .false., idummy, lidummy)
351 IF (keep(60).NE.0)
THEN
352 IF (keep(60)==1)
THEN
361 IF (keep(60)==1)
THEN
367 fils(in) = listvar_schur(i)
374 & iwtemp(1,3), info(6),
375 & info(5), keep(2),keep(50),
376 & keep8(101), keep(108),keep(5),
377 & keep(6), keep(226), keep(253))
378 IF ( keep(53) .NE. 0 )
THEN
381 IF ( keep(48) == 4 .OR.
382 & ( (keep(24).NE.0).AND.(keep8(21).GT.0_8) ) )
THEN
384 & keep(48), keep(50), nslaves)
386 IF (keep(210).LT.0.OR.keep(210).GT.2) keep(210)=0
387 IF (keep(210).EQ.0.AND.keep(201).GT.0) keep(210)=1
388 IF (keep(210).EQ.0.AND.keep(201).EQ.0) keep(210)=2
389 IF (keep(210).EQ.2) keep8(79)=huge(keep8(79))
390 IF (keep(210).EQ.1.AND.keep8(79).LE.0_8)
THEN
391 keep8(79)=k79ref * int(nslaves,8)
393 IF (keep(79).EQ.0)
THEN
394 IF (keep(210).EQ.1)
THEN
396 IF ( keep(62).GE.1)
THEN
399 & idummy, lidummy, info(6),
400 & nslaves, keep,keep8, splitroot,
401 & mp, ldiag, info(1), info(2))
402 IF (info(1).LT.0)
GOTO 90
404 WRITE(mp,*)
" Number of split nodes in pre-splitting=",
410 splitroot = ((icntl(13).GT.0 .AND. nslaves.GT.icntl(13)) .OR.
412 IF (keep(53) .NE. 0)
THEN
415 splitroot = (splitroot.AND.( (keep(60).EQ.0) ))
419 & idummy, lidummy, info(6),
420 & nslaves, keep,keep8, splitroot,
421 & mp, ldiag, info(1), info(2))
422 IF (info(1).LT.0)
GOTO 90
423 IF ( keep(53) .NE. 0 )
THEN
427 IF (ldiag.GT.2 .AND. mp.GT.0)
THEN
429 IF (ldiag.EQ.4) k = n
430 IF (k.GT.0)
WRITE (mp,99997) (ikeep(i,1),i=1,k)
431 IF (k.GT.0)
WRITE (mp,99991) (ikeep(i,2),i=1,k)
432 IF (k.GT.0)
WRITE (mp,99990) (ikeep(i,3),i=1,k)
433 IF (k.GT.0)
WRITE (mp,99987) (nfsiz(i),i=1,k)
434 IF (k.GT.0)
WRITE (mp,99989) (fils(i),i=1,k)
435 IF (k.GT.0)
WRITE (mp,99988) (frere(i),i=1,k)
441 IF (info(1) .LT.0)
THEN
442 IF ((lp.GT.0).AND.(icntl(4).GE.1))
WRITE (lp,99996) info(1)
443 IF ((lp.GT.0).AND.(icntl(4).GE.1))
WRITE (lp,99982) info(2)
445 IF (
allocated(iw))
DEALLOCATE(iw)
446 IF (
allocated(ipe8))
DEALLOCATE(ipe8)
447 IF (
allocated(iw2))
DEALLOCATE(iw2)
448 IF (
allocated(iwtemp))
DEALLOCATE(iwtemp)
45099999
FORMAT (/
'Entering analysis phase with ...'/
451 &
' N NELT LIW INFO(1)'/,
452 & 9x, i10, i11, i12, i14)
45399998
FORMAT (
'Element pointers: ELTPTR() '/(9x, 7i10))
45499995
FORMAT (
'Element variables: ELTVAR() '/(9x, 7i10))
45599997
FORMAT (
'IKEEP(.,1)=', 10i6/(12x, 10i6))
45699996
FORMAT (/
'** Error return ** from Analysis * INFO(1)=', i3)
45799991
FORMAT (
'IKEEP(.,2)=', 10i6/(12x, 10i6))
45899990
FORMAT (
'IKEEP(.,3)=', 10i6/(12x, 10i6))
45999989
FORMAT (
'FILS (.) =', 10i6/(12x, 10i6))
46099988
FORMAT (
'FRERE(.) =', 10i6/(12x, 10i6))
46199987
FORMAT (
'NFSIZ(.) =', 10i6/(12x, 10i6))
46299982
FORMAT (
'Error in permutation array KEEP INFO(2)=', i3)