34 IMPLICIT NONE
35 INTEGER, INTENT(IN) :: N, SIZE_SCHUR, NSLAVES
36 INTEGER(8), INTENT(IN) :: NZ8
37 INTEGER(8), INTENT(IN) :: LIWALLOC
38 INTEGER, INTENT(in) :: LISTVAR_SCHUR(:)
39 INTEGER, POINTER :: IRN(:), ICN(:)
40 INTEGER, INTENT(IN) :: ICNTL(60)
41 INTEGER, INTENT(INOUT) :: IORD
42 INTEGER, INTENT(INOUT) :: INFO(80), KEEP(500)
43 INTEGER(8), INTENT(INOUT) :: KEEP8(150)
44 INTEGER, INTENT(OUT) :: NFSIZ(:), FILS(:), FRERE(:)
45 INTEGER, INTENT(INOUT) :: PIV(:)
46 INTEGER, INTENT(INOUT) :: IKEEP1(:), IKEEP2(:), IKEEP3(:)
47 REAL :: CNTL4
48 REAL, POINTER :: COLSCA(:), ROWSCA(:)
49#if defined(metis) || defined(parmetis) || defined(metis4) || defined(parmetis3)
50 INTEGER, INTENT(IN) :: METIS_OPTIONS(40)
51#endif
52 INTEGER, INTENT(IN), OPTIONAL :: NORIG_ARG
53 INTEGER, INTENT(IN), OPTIONAL :: SIZEOFBLOCKS(N)
54 LOGICAL, INTENT(IN), OPTIONAL :: GCOMP_PROVIDED_IN
55 TYPE(COMPACT_GRAPH_T), OPTIONAL :: GCOMP
56 INTEGER, DIMENSION(:), ALLOCATABLE, TARGET :: IWALLOC
57 INTEGER, DIMENSION(:), POINTER :: IW
58 INTEGER(8), DIMENSION(:), ALLOCATABLE, TARGET :: IPEALLOC
59 INTEGER(8), DIMENSION(:), POINTER :: IPE
60 INTEGER(8), DIMENSION(:), ALLOCATABLE :: IPQ8
61 INTEGER, DIMENSION(:,:), ALLOCATABLE :: PTRAR
62 INTEGER, DIMENSION(:), ALLOCATABLE :: PARENT
63 INTEGER, DIMENSION(:), ALLOCATABLE :: IWL1
64 INTEGER NBBUCK
65 INTEGER, DIMENSION(:), ALLOCATABLE :: WTEMP
66 INTEGER IERR
67 INTEGER I, K, NCMPA, IN, IFSON
68 INTEGER(8) :: J8, I8
69 INTEGER :: NORIG
70 INTEGER(8) :: IFIRST, ILAST
71 INTEGER(8) IWFR8
72 INTEGER NEMIN, LP, MP, LDIAG, ITEMP, symmetry
73 INTEGER NBQD, AvgDens
74 LOGICAL PROK, COMPRESS_SCHUR, LPOK, COMPUTE_PERM
75#if defined(metis) || defined(parmetis) || defined(metis4) || defined(parmetis3)
76#if defined(metis4) || defined(parmetis3)
77 INTEGER NUMFLAG
78#endif
79 INTEGER METIS_IDX_SIZE
80 INTEGER OPT_METIS_SIZE
81#endif
82#if defined(scotch) || defined(ptscotch)
83 INTEGER :: SCOTCH_INT_SIZE
84#endif
85#if defined(pord)
86 INTEGER :: PORD_INT_SIZE
87#endif
88 REAL, DIMENSION(:), ALLOCATABLE :: COLSCA_TEMP
89 INTEGER THRESH, IVersion
90 LOGICAL AGG6
91 INTEGER MINSYM
92 parameter(minsym=50)
93 INTEGER(8) :: K79REF
94 parameter(k79ref=12000000_8)
95 INTEGER, PARAMETER :: LIDUMMY = 1
96 INTEGER :: IDUMMY(1)
97 INTEGER MTRANS, COMPRESS,NCMP,IERROR,J,JPERM,NCST
98 INTEGER TOTEL
99#if defined(pord)
100 INTEGER TOTW
101#endif
102 INTEGER WEIGHTUSED
103#if defined(scotch) || defined(ptscotch)
104 INTEGER WEIGHTREQUESTED
105#endif
106 LOGICAL SCOTCH_SYMBOLIC
107 LOGICAL IDENT,SPLITROOT
108 LOGICAL FREE_CENTRALIZED_MATRIX
109 LOGICAL GCOMP_PROVIDED
110 LOGICAL INPLACE64_GRAPH_COPY, INPLACE64_RESTORE_GRAPH
111 INTEGER(8) :: LIW8, NZG8
112 DOUBLE PRECISION TIMEB
116#if defined(OLDDFS)
117 EXTERNAL smumps_ana_l
118#endif
122 IF (liwalloc.GT.0_8) THEN
123 ALLOCATE( iwalloc(liwalloc), stat = ierr )
124 IF ( ierr .GT. 0 ) THEN
125 info( 1 ) = -7
127 GOTO 90
128 ENDIF
129 ENDIF
130 ALLOCATE( iwl1(n), stat = ierr )
131 IF ( ierr .GT. 0 ) THEN
132 info( 1 ) = -7
133 info( 2 ) = n
134 GOTO 90
135 ENDIF
136 ALLOCATE( ipealloc(n+1), stat = ierr )
137 IF ( ierr .GT. 0 ) THEN
138 info( 1 ) = -7
139 info( 2 ) = (n+1)*keep(10)
140 GOTO 90
141 ENDIF
142 ALLOCATE( ptrar(n,3), stat = ierr )
143 IF ( ierr .GT. 0 ) THEN
144 info( 1 ) = -7
145 info( 2 ) = 3*n
146 GOTO 90
147 ENDIF
148 scotch_symbolic=(keep(270).EQ.0)
149 symmetry = info(8)
150 nbqd = 0
151 gcomp_provided=.false.
152 weightused = 0
153 norig = n
154 IF (present(norig_arg)) THEN
155 norig=norig_arg
156 ENDIF
157 IF (present(gcomp_provided_in))
158 & gcomp_provided = gcomp_provided_in
159 IF (gcomp_provided.AND.(.NOT. present(gcomp))) THEN
160 info(1) = -900
161 WRITE(6,*) " INTERNAL ERROR in MUMPS(ANA_F) ",
162 & gcomp_provided_in, present(gcomp)
163 info(2) = 1
164 RETURN
165 ENDIF
166 IF ( (liwalloc.EQ.0_8).AND.(.not.gcomp_provided)) THEN
167 info(1) = -900
168 WRITE(6,*) " INTERNAL ERROR in MUMPS(ANA_F) ",
169 & "LIWALLOC, GCOMP_PROVIDED=", liwalloc, gcomp_provided
170 info(2) = 2
171 RETURN
172 ENDIF
173 IF (gcomp_provided) THEN
174 nzg8 = gcomp%NZG
175 liw8 = nzg8 + int(gcomp%NG,8)+1_8
176 iw => gcomp%ADJ(1:liw8)
177 ipe => gcomp%IPE(1:gcomp%NG+1)
178 DO i=1,gcomp%NG
179 ptrar(i,2) = int(ipe(i+1)-ipe(i))
180 ENDDO
181 ELSE
182 liw8 = liwalloc
183 nzg8 = nz8
184 iw => iwalloc(1:liw8)
185 ipe => ipealloc(1:n+1)
186 ENDIF
187 lp = icntl(1)
188 mp = icntl(3)
189 lpok = ((lp.GT.0).AND.(icntl(4).GE.1))
190 prok = ((mp.GT.0).AND.(icntl(4).GE.2))
191 ldiag = icntl(4)
192 compress_schur = .false.
193 IF (prok) THEN
194 IF (present(gcomp)) THEN
195 WRITE(mp,'(A,I10,A,I13,A)') " Processing a graph of size:", n
196 & ," with ", gcomp%NZG, " edges"
197 ELSE
198 WRITE(mp,'(A,I10)') " Processing a graph of size:", n
199 ENDIF
200 ENDIF
201 IF (gcomp_provided) THEN
202 free_centralized_matrix = .false.
203 ELSE
204 free_centralized_matrix = (
205 & (keep(54).EQ.3).AND.
206 & (keep(494).EQ.0).AND.
207 & (keep(106).NE.3)
208 & )
209 ENDIF
210 inplace64_graph_copy = .false.
211 inplace64_restore_graph = .true.
212 IF (keep(1).LT.0) keep(1) = 0
213 nemin = keep(1)
214 IF (ldiag.GT.2 .AND. mp.GT.0) THEN
215 IF (present(sizeofblocks)) THEN
217 IF (ldiag.EQ.4) k = gcomp%NG
218 WRITE (mp,99909) n, nzg8, info(1)
219 i8= 0_8
220 WRITE(mp,'(A)') " Graph adjacency "
221 DO j=1, k
222 ifirst = gcomp%IPE(j)
223 ilast=
min(gcomp%IPE(j+1)-1,gcomp%IPE(j)+k-1)
224 write(mp,'(A,I10)') " .... node/column:", j
225 write(mp,'(8X,10I9)')
226 & (gcomp%ADJ(i8),i8=ifirst,ilast)
227 ENDDO
228 ELSE
230 IF (ldiag .EQ.4) j8 = nzg8
231 WRITE (mp,99999) n, nzg8, liw8, info(1)
232 IF (j8.GT.0_8) WRITE (mp,99998) (irn(i8),icn(i8),i8=1_8,j8)
233 ENDIF
234 k = min0(10,n)
235 IF (ldiag.EQ.4) k = n
236 IF (iord.EQ.1 .AND. k.GT.0) THEN
237 WRITE (mp,99997) (ikeep1(i),i=1,k)
238 ENDIF
239 ENDIF
240 ncmp = n
241 IF (keep(60).NE.0) THEN
242 IF ((size_schur.LE.0 ).OR.
243 & (size_schur.GE.n) ) GOTO 90
244 ENDIF
245#if defined(metis) || defined(parmetis) || defined(metis4) || defined(parmetis3)
246 IF ( ( keep(60).NE.0).AND.(size_schur.GT.0)
247 & .AND.
248 & ((iord.EQ.7).OR.(iord.EQ.5))
249 & )THEN
250 compress_schur=.true.
251 ncmp = n-size_schur
252 ALLOCATE(ipq8(n),stat=ierr)
253 IF ( ierr .GT. 0 ) THEN
254 info( 1 ) = -7
255 info( 2 ) = n*keep(10)
256 ENDIF
258 & ipe(1), ptrar(1,2),
259 & ipq8, iwl1, iwfr8, keep8(126), keep8(127),
260 & info(1), info(2), icntl, symmetry,
261 & keep(50), nbqd, avgdens,
262 & keep(264), keep(265),
263 & listvar_schur(1), size_schur, frere(1), fils(1),
264 & inplace64_graph_copy)
265 info(8) = symmetry
266 inplace64_graph_copy = inplace64_graph_copy.AND.
267 & (.NOT.free_centralized_matrix)
268 DEALLOCATE(ipq8)
269 iord = 5
270 keep(95) = 1
271 nbqd = 0
272 ELSE
273#endif
274 IF (gcomp_provided) THEN
275 iwfr8 = gcomp%NZG+1_8
276 ELSE
277 ALLOCATE(ipq8(n),stat=ierr)
278 IF ( ierr .GT. 0 ) THEN
279 info( 1 ) = -7
280 info( 2 ) = n*keep(10)
281 ENDIF
282 IF ( prok ) THEN
284 ENDIF
286 & ipe(1), ptrar(1,2),
287 & ipq8, iwl1, iwfr8, keep8(126), keep8(127),
288 & info(1), info(2), icntl, symmetry,
289 & keep(50), nbqd, avgdens, keep(264), keep(265),
290 & .true., inplace64_graph_copy)
291 info(8) = symmetry
292 inplace64_graph_copy = inplace64_graph_copy.AND.
293 & (.NOT.free_centralized_matrix)
294 DEALLOCATE(ipq8)
295 ENDIF
296#if defined(metis) || defined(parmetis) || defined(metis4) || defined(parmetis3)
297 ENDIF
298#endif
299 IF(nbqd .GT. 0) THEN
300 IF( keep(50) .EQ. 2 .AND. icntl(12) .EQ. 0 ) THEN
301 IF(keep(95) .NE. 1) THEN
302 IF ( prok )
303 & WRITE( mp,*)
304 & 'Compressed/constrained ordering set OFF'
305 keep(95) = 1
306 ENDIF
307 ENDIF
308 ENDIF
309 IF ( (keep(60).NE.0) .AND. (iord.GT.1) .AND.
310 & .NOT. compress_schur ) THEN
311 iord = 0
312 ENDIF
313 IF ( (keep(50).EQ.2)
314 & .AND. (keep(95) .EQ. 3)
315 & .AND. (iord .EQ. 7) ) THEN
316 iord = 2
317 ENDIF
319 & keep(50), nslaves, iord,
320 & nbqd, avgdens,
321 & prok, mp )
322 IF(keep(50) .EQ. 2) THEN
323 IF(keep(95) .EQ. 3 .AND. iord .NE. 2) THEN
324 IF (prok) WRITE(mp,*)
325 & 'WARNING: SMUMPS_ANA_F constrained ordering not '//
326 & ' available with selected ordering. Move to' //
327 & ' compressed ordering.'
328 keep(95) = 2
329 ENDIF
330 ELSE
331 keep(95) = 1
332 ENDIF
333 mtrans = keep(23)
334 compress = keep(95) - 1
335 IF(compress .GT. 0 .AND. keep(52) .EQ. -2) THEN
336 IF(cntl4 .GE. 0.0e0) THEN
337 IF (keep(1).LE.8) THEN
338 nemin = 16
339 ELSE
340 nemin = 2*keep(1)
341 ENDIF
342 ENDIF
343 ENDIF
344 IF(mtrans .GT. 0 .AND. keep(50) .EQ. 2) THEN
345 keep(23) = 0
346 ENDIF
347 IF (compress .EQ. 2) THEN
348 IF (iord.NE.2) THEN
349 WRITE(*,*) "IORD not compatible with COMPRESS:",
350 & iord, compress
352 ENDIF
354 & n,piv(1),frere(1),fils(1),nfsiz(1),ikeep1(1),
355 & ncst,keep,keep8, rowsca(1)
356 & )
357 ENDIF
358 IF ( iord .NE. 1 ) THEN
359 IF (compress .GE. 1) THEN
360 ALLOCATE(ipq8(n),stat=ierr)
361 IF ( ierr .GT. 0 ) THEN
362 info( 1 ) = -7
363 info( 2 ) = n*keep(10)
364 ENDIF
366 & n, nz8, irn(1), icn(1), piv(1),
367 & ncmp, iw(1), liw8, ipe(1), ptrar(1,2), ipq8,
368 & iwl1, fils(1), iwfr8,
369 & ierror, keep, keep8, icntl, inplace64_graph_copy)
370 DEALLOCATE(ipq8)
371 symmetry = 100
372 ENDIF
373 IF ( (symmetry.LT.minsym).AND.(keep(50).EQ.0) ) THEN
374 IF(keep(23) .EQ. 7 ) THEN
375 keep(23) = -5
376 GOTO 90
377 ELSE IF(keep(23) .EQ. -9876543) THEN
378 ident = .true.
379 keep(23) = 5
380 IF (prok) WRITE(mp,'(A)')
381 & ' ... Apply column permutation (already computed)'
382 DO j=1,n
383 jperm = piv(j)
384 fils(jperm) = j
385 IF (jperm.NE.j) ident = .false.
386 ENDDO
387 IF (.NOT.ident) THEN
388 DO j8=1_8,nz8
389 j = icn(j8)
390 IF ((j.LE.0).OR.(j.GT.n)) cycle
391 icn(j8) = fils(j)
392 ENDDO
393 ALLOCATE(colsca_temp(n), stat=ierr)
394 IF ( ierr > 0 ) THEN
395 info( 1 ) = -7
396 info( 2 ) = n
397 GOTO 90
398 ENDIF
399 DO j = 1, n
400 colsca_temp(j)=colsca(j)
401 ENDDO
402 DO j=1, n
403 colsca(fils(j))=colsca_temp(j)
404 ENDDO
405 DEALLOCATE(colsca_temp)
406 IF (prok)
407 & WRITE(mp,'(/A)')
408 & ' WARNING input matrix data modified'
409 ALLOCATE(ipq8(n),stat=ierr)
410 IF ( ierr .GT. 0 ) THEN
411 info( 1 ) = -7
412 info( 2 ) = n*keep(10)
413 ENDIF
415 & (n,nz8,irn(1), icn(1), iw(1), liw8,
416 & ipe(1), ptrar(1,2),
417 & ipq8, iwl1, iwfr8, keep8(126), keep8(127),
418 & info(1), info(2), icntl, symmetry, keep(50),
419 & nbqd, avgdens, keep(264), keep(265),
420 & .true.,inplace64_graph_copy)
421 info(8) = symmetry
422 DEALLOCATE(ipq8)
423 ncmp = n
424 ELSE
425 keep(23) = 0
426 ENDIF
427 ENDIF
428 ELSE IF (keep(23) .EQ. 7 .OR. keep(23) .EQ. -9876543 ) THEN
429 IF (prok) WRITE(mp,'(A)')
430 & ' ... No column permutation'
431 keep(23) = 0
432 ENDIF
433 ENDIF
434 IF (free_centralized_matrix
435 & .AND.compress.EQ.0.AND.(.NOT.compress_schur)) THEN
436 deallocate(irn)
437 NULLIFY(irn)
438 deallocate(icn)
439 NULLIFY(icn)
440 ENDIF
441 inplace64_restore_graph =
442 & inplace64_restore_graph.AND.(compress.NE.1)
443 ALLOCATE( parent( n ), stat = ierr )
444 IF ( ierr .GT. 0 ) THEN
445 info( 1 ) = -7
446 info( 2 ) = n
447 GOTO 90
448 ENDIF
449 IF (iord.NE.1 .AND. iord.NE.5) THEN
450 IF ( keep(60) .NE. 0 ) THEN
451 iord = 0
452 ENDIF
453 IF (prok) THEN
454 IF (iord.EQ.2) THEN
455 WRITE(mp,'(A)') ' Ordering based on AMF '
456#if defined(scotch) || defined(ptscotch)
457 ELSE IF (iord.EQ.3) THEN
458 WRITE(mp,'(A)') ' Ordering based on SCOTCH '
459#endif
460#if defined(pord)
461 ELSE IF (iord.EQ.4) THEN
462 WRITE(mp,'(A)') ' Ordering based on PORD '
463#endif
464 ELSE IF (iord.EQ.6) THEN
465 WRITE(mp,'(A)') ' Ordering based on QAMD '
466 ELSE
467 WRITE(mp,'(A)') ' Ordering based on AMD '
468 ENDIF
469 ENDIF
470 IF ( prok ) THEN
472 ENDIF
473 IF ( keep(60) .NE. 0 ) THEN
474 CALL mumps_hamd(n, liw8, ipe(1), iwfr8, ptrar(1,2), iw(1),
475 & iwl1, ikeep1(1),
476 & ikeep2(1), ncmpa, fils(1), ikeep3(1),
477 & ptrar, ptrar(1,3),
478 & parent,
479 & listvar_schur(1), size_schur)
480 IF (keep(60)==1) THEN
481 keep(20) = listvar_schur(1)
482 ELSE
483 keep(38) = listvar_schur(1)
484 ENDIF
485 ELSE
486 IF ( .false. ) THEN
487#if defined(pord)
488 ELSEIF (iord .EQ. 4) THEN
489 CALL mumps_pord_intsize(pord_int_size)
490 totw = n
491 IF ( (compress .EQ. 1)
492 & .OR.
493 & ( (norig.NE.n).AND.present(sizeofblocks) )
494 & ) THEN
495 IF (compress .EQ. 1) THEN
496 DO i=1,keep(93)/2
497 iwl1(i) = 2
498 ENDDO
499 DO i=1+keep(93)/2,ncmp
500 iwl1(i) = 1
501 ENDDO
502 ELSE IF
503 & ( (norig.NE.n).AND.present(sizeofblocks) ) THEN
504 totw = norig
505 DO i= 1, n
506 iwl1(i) = sizeofblocks(i)
507 ENDDO
508 ENDIF
509 IF (pord_int_size .EQ. 64) THEN
510 CALL mumps_pordf_wnd_mixedto64(ncmp, iwfr8-1_8,
511 & ipe, iw,
512 & iwl1, ncmpa, totw, parent,
513 & info(1), lp, lpok, keep(10),
514 & inplace64_graph_copy
515 & )
516 ELSE IF (pord_int_size .EQ. 32) THEN
517 CALL mumps_pordf_wnd_mixedto32(ncmp, iwfr8-1_8,
518 & ipe, iw,
519 & iwl1, ncmpa, totw, parent,
520 & info(1), lp, lpok, keep(10))
521 ELSE
522 WRITE(*,*)
523 & "Internal error in PORD wrappers, PORD_INT_SIZE=",
524 & pord_int_size
526 ENDIF
527 IF ( ncmpa .NE. 0 ) THEN
528 write(6,*) ' Out PORD, NCMPA=', ncmpa
529 info( 1 ) = -9999
530 info( 2 ) = 4
531 GOTO 90
532 ENDIF
533 IF (info(1) .LT.0) GOTO 90
534 IF (compress.EQ.1) THEN
537 & frere(1),ptrar(1,1))
538 DO i=1,ncmp
539 ikeep2(ikeep1(i))=i
540 ENDDO
541 ENDIF
542 ELSE
543 IF (pord_int_size.EQ.64) THEN
544 CALL mumps_pordf_mixedto64(ncmp, iwfr8-1_8, ipe,
545 & iw,
546 & iwl1, ncmpa, parent,
547 & info(1), lp, lpok, keep(10),
548 & inplace64_graph_copy
549 & )
550 ELSE IF (pord_int_size.EQ.32) THEN
551 CALL mumps_pordf_mixedto32(ncmp, iwfr8-1_8, ipe,
552 & iw,
553 & iwl1, ncmpa, parent,
554 & info(1), lp, lpok, keep(10))
555 ELSE
556 WRITE(*,*)
557 & "Internal error in PORD wrappers, PORD_INT_SIZE=",
558 & pord_int_size
560 ENDIF
561 ENDIF
562 IF ( ncmpa .NE. 0 ) THEN
563 write(6,*) ' Out PORD, NCMPA=', ncmpa
564 info( 1 ) = -9999
565 info( 2 ) = 4
566 GOTO 90
567 ENDIF
568 IF (info(1) .LT. 0) GOTO 90
569#endif
570#if defined(scotch) || defined(ptscotch)
571 ELSEIF (iord .EQ. 3) THEN
572 CALL mumps_scotch_intsize(scotch_int_size)
573 IF ( (compress .EQ. 1)
574 & .OR.
575 & ( (norig.NE.n).AND.present(sizeofblocks) )
576 & ) THEN
577 weightrequested=1
578 IF (compress .EQ. 1) THEN
579 DO i=1,keep(93)/2
580 iwl1(i) = 2
581 ENDDO
582 DO i=1+keep(93)/2,ncmp
583 iwl1(i) = 1
584 ENDDO
585 ELSE IF
586 & ( (norig.NE.n).AND.present(sizeofblocks) ) THEN
587 DO i= 1, n
588 iwl1(i) = sizeofblocks(i)
589 ENDDO
590 ENDIF
591 ELSE
592 weightrequested = 0
593 DO i= 1, n
594 iwl1(i) = 1
595 ENDDO
596 ENDIF
597 IF (scotch_int_size.EQ.32) THEN
598 IF (keep(10).EQ.1) THEN
599 info(1) = -52
600 info(2) = 2
601 ELSE
602 CALL mumps_scotch_mixedto32(ncmp,
603 & iwfr8-1_8, ipe,
604 & parent, iwfr8,
605 & ptrar(1,2), iw, iwl1, ikeep1,
606 & ikeep2, ncmpa, info, lp, lpok,
607 & weightused, weightrequested, scotch_symbolic)
608 ENDIF
609 ELSE IF (scotch_int_size.EQ.64) THEN
610 CALL mumps_scotch_mixedto64(ncmp,
611 & iwfr8-1_8, ipe,
612 & parent, iwfr8,
613 & ptrar(1,2), iw, iwl1, ikeep1,
614 & ikeep2, ncmpa, info, lp, lpok, keep(10),
615 & inplace64_graph_copy,
616 & weightused, weightrequested, scotch_symbolic)
617 ELSE
618 WRITE(*,*)
619 & "Internal error in SCOTCH wrappers, SCOTCH_INT_SIZE=",
620 & scotch_int_size
622 ENDIF
623 IF (info(1) .LT. 0) GOTO 90
624 IF (.NOT. scotch_symbolic) THEN
625 IF ( compress .EQ. 1 ) THEN
627 & keep(93),piv(1),ikeep1(1),ikeep2(1))
628 compress = -1
629 ENDIF
630 ELSE IF ( (compress .EQ. 1)
631 & .OR.
632 & ( (norig.NE.n).AND.present(sizeofblocks).AND.
633 & (weightused.EQ.0) )
634 & ) THEN
637 & frere(1),ptrar(1,1))
638 DO i=1,ncmp
639 ikeep2(ikeep1(i))=i
640 ENDDO
641 ENDIF
642#endif
643 ELSEIF (iord .EQ. 2) THEN
644 nbbuck = 2*n
645 compute_perm=.false.
646 IF(compress .GE. 1) THEN
647 compute_perm=.true.
648 DO i=1,keep(93)/2
649 iwl1(i) = 2
650 ENDDO
651 DO i=1+keep(93)/2,ncmp
652 iwl1(i) = 1
653 ENDDO
654 totel = keep(93)+keep(94)
655 ELSE
656 iwl1(1) = -1
657 totel = n
658 ENDIF
659 IF (present(sizeofblocks)) THEN
660 IF (compress.GE.1) THEN
662 ENDIF
663 nbbuck =
max(nbbuck, norig-n)
664 nbbuck =
max(nbbuck, 2*norig)
665 ncmp = n
666 totel = norig
667 DO i= 1, n
668 iwl1(i) = sizeofblocks(i)
669 ENDDO
670 ENDIF
671 ALLOCATE( wtemp( 0: nbbuck + 1), stat = ierr )
672 IF ( ierr .GT. 0 ) THEN
673 info( 1 ) = -7
674 info( 2 ) = nbbuck+2
675 GOTO 90
676 ENDIF
677 IF(compress .LE. 1) THEN
679 & (totel, ncmp, compute_perm, nbbuck, liw8, ipe(1),
680 & iwfr8, ptrar(1,2),
681 & iw(1), iwl1, ikeep1(1), ikeep2(1), ncmpa, fils(1),
682 & ikeep3(1), ptrar, ptrar(1,3), wtemp, parent(1))
683 ELSE
684 IF(prok) WRITE(mp,'(A)')
685 & ' Constrained Ordering based on AMF'
687 & iwfr8, ptrar(1,2),
688 & iw(1), iwl1, ikeep1(1), ikeep2(1), ncmpa, fils(1),
689 & ikeep3(1), ptrar, ptrar(1,3), wtemp,
690 & nfsiz(1), frere(1), parent(1))
691 ENDIF
692 DEALLOCATE(wtemp)
693 ELSEIF (iord .EQ. 6) THEN
694 ALLOCATE( wtemp( n ), stat = ierr )
695 IF ( ierr .GT. 0 ) THEN
696 info( 1 ) = -7
697 info( 2 ) = n
698 GOTO 90
699 ENDIF
700 thresh = 1
701 iversion = 2
702 compute_perm=.false.
703 IF(compress .EQ. 1) THEN
704 compute_perm=.true.
705 DO i=1,keep(93)/2
706 iwl1(i) = 2
707 ENDDO
708 DO i=1+keep(93)/2,ncmp
709 iwl1(i) = 1
710 ENDDO
711 totel = keep(93)+keep(94)
712 ELSE
713 iwl1(1) = -1
714 totel = n
715 ENDIF
716 IF (present(sizeofblocks)) THEN
717 IF (compress.EQ.1) THEN
719 ENDIF
720 ncmp = n
721 totel = norig
722 DO i= 1, n
723 iwl1(i) = sizeofblocks(i)
724 ENDDO
725 ENDIF
727 & (totel,compute_perm,iversion, thresh, wtemp,
728 & ncmp, liw8, ipe(1), iwfr8, ptrar(1,2), iw(1),
729 & iwl1, ikeep1(1), ikeep2(1), ncmpa, fils(1),
730 & ikeep3(1), ptrar, ptrar(1,3), parent(1))
731 DEALLOCATE(wtemp)
732 ELSE
733 compute_perm=.false.
734 IF(compress .EQ. 1) THEN
735 compute_perm=.true.
736 DO i=1,keep(93)/2
737 iwl1(i) = 2
738 ENDDO
739 DO i=1+keep(93)/2,ncmp
740 iwl1(i) = 1
741 ENDDO
742 totel = keep(93)+keep(94)
743 ELSE
744 iwl1(1) = -1
745 totel = n
746 ENDIF
747 IF (present(sizeofblocks)) THEN
748 IF (compress.EQ.1) THEN
750 ENDIF
751 ncmp = n
752 totel = norig
753 DO i= 1, n
754 iwl1(i) = sizeofblocks(i)
755 ENDDO
756 ENDIF
758 & ncmp, liw8, ipe(1), iwfr8, ptrar(1,2),
759 & iw(1), iwl1, ikeep1(1), ikeep2(1), ncmpa, fils(1),
760 & ikeep3(1), ptrar, ptrar(1,3), parent(1))
761 ENDIF
762 ENDIF
763 IF(compress .GE. 1) THEN
765 & piv(1),ikeep1(1),ikeep2(1))
766 compress = -1
767 ENDIF
768 IF ( prok ) THEN
770#if defined(scotch) || defined(ptscotch)
771 IF (iord.EQ.3) THEN
772 WRITE( mp, '(A,F12.4)' )
773 & ' ELAPSED TIME SPENT IN SCOTCH reordering =', timeb
774 ENDIF
775#endif
776 ENDIF
777 ENDIF
778#if defined(metis) || defined(parmetis) || defined(metis4) || defined(parmetis3)
779 IF (iord.EQ.5) THEN
780 IF (prok) THEN
781 WRITE(mp,'(A)') ' Ordering based on METIS'
782 ENDIF
783 IF ( prok ) THEN
785 ENDIF
786 CALL mumps_metis_idxsize(metis_idx_size)
787 IF (keep(10).EQ.1.AND.metis_idx_size.NE.64) THEN
788 info(1) = -52
789 info(2) = 1
790 GOTO 90
791 ENDIF
792#if defined(metis4) || defined(parmetis3)
793 numflag = 1
794 opt_metis_size = 8
795#else
796 opt_metis_size = 40
797#endif
798 IF (compress .EQ. 1) THEN
799 DO i=1,keep(93)/2
800 frere(i) = 2
801 ENDDO
802 DO i=keep(93)/2+1,ncmp
803 frere(i) = 1
804 ENDDO
805#if defined(metis4) || defined(parmetis3)
806 IF (metis_idx_size .EQ.32) THEN
807 CALL mumps_metis_nodewnd_mixedto32(
808 & ncmp, ipe, iw, frere,
809 & numflag, metis_options(1), opt_metis_size,
810 & ikeep2, ikeep1, info(1), lp, lpok )
811 ELSE IF (metis_idx_size .EQ.64) THEN
812 CALL mumps_metis_nodewnd_mixedto64(
813 & ncmp, ipe, iw, frere,
814 & numflag, metis_options(1), opt_metis_size,
815 & ikeep2, ikeep1, info(1), lp, lpok, keep(10),
816 & inplace64_graph_copy )
817 ELSE
818 WRITE(*,*)
819 & "Internal error in METIS wrappers, METIS_IDX_SIZE=",
820 & metis_idx_size
822 ENDIF
823 ELSE
824 IF ((norig.NE.n).AND.present(sizeofblocks)) THEN
825 DO i=1, n
826 frere(i) = sizeofblocks(i)
827 ENDDO
828 IF (metis_idx_size .EQ.32) THEN
829 CALL mumps_metis_nodewnd_mixedto32(
830 & ncmp, ipe, iw, frere,
831 & numflag, metis_options(1), opt_metis_size,
832 & ikeep2, ikeep1, info(1), lp, lpok )
833 ELSE IF (metis_idx_size .EQ.64) THEN
834 CALL mumps_metis_nodewnd_mixedto64(
835 & ncmp, ipe, iw, frere,
836 & numflag, metis_options(1), opt_metis_size,
837 & ikeep2, ikeep1, info(1), lp, lpok, keep(10),
838 & inplace64_graph_copy )
839 ELSE
840 WRITE(*,*)
841 & "Internal error in METIS wrappers, METIS_IDX_SIZE=",
842 & metis_idx_size
844 ENDIF
845 ELSE
846 IF (metis_idx_size .EQ.32) THEN
847 CALL mumps_metis_nodend_mixedto32(
848 & ncmp, ipe, iw, numflag,
849 & metis_options(1), opt_metis_size,
850 & ikeep2, ikeep1, info(1), lp, lpok )
851 ELSE IF (metis_idx_size .EQ.64) THEN
852 CALL mumps_metis_nodend_mixedto64(
853 & ncmp, ipe, iw, numflag,
854 & metis_options(1), opt_metis_size,
855 & ikeep2, ikeep1, info(1), lp,lpok,keep(10),
856 & liw8, inplace64_graph_copy,
857 & inplace64_restore_graph)
858 ELSE
859 WRITE(*,*)
860 & "Internal error in METIS wrappers, METIS_IDX_SIZE=",
861 & metis_idx_size
863 ENDIF
864 ENDIF
865 ENDIF
866#else
867 ELSE
868 IF (present(sizeofblocks)) THEN
869 DO i=1,n
870 frere(i) = sizeofblocks(i)
871 ENDDO
872 ELSE
873 DO i=1,ncmp
874 frere(i) = 1
875 ENDDO
876 ENDIF
877 ENDIF
878 IF (metis_idx_size .EQ. 32) THEN
879 CALL mumps_metis_nodend_mixedto32(
880 & ncmp, ipe, iw, frere,
881 & metis_options(1), opt_metis_size,
882 & ikeep2, ikeep1, info(1), lp, lpok )
883 ELSE IF (metis_idx_size .EQ. 64) THEN
884 CALL mumps_metis_nodend_mixedto64(
885 & ncmp, ipe, iw, frere,
886 & metis_options(1), opt_metis_size,
887 & ikeep2, ikeep1, info(1), lp,lpok,keep(10),
888 & liw8, inplace64_graph_copy,
889 & inplace64_restore_graph)
890 ELSE
891 IF (lpok) WRITE(lp,*)
892 & "Internal error in METIS wrappers, METIS_IDX_SIZE=",
893 & metis_idx_size
895 ENDIF
896#endif
897 IF (info(1) .LT.0) GOTO 90
898 IF ( prok ) THEN
900 WRITE( mp, '(A,F12.4)' )
901 & ' ELAPSED TIME SPENT IN METIS reordering =', timeb
902 ENDIF
903 IF ( compress_schur ) THEN
905 & n, ncmp, ikeep1(1),ikeep2(1),
906 & listvar_schur(1), size_schur, fils(1))
907 compress = -1
908 ENDIF
909 IF (compress .EQ. 1) THEN
911 & keep(93),piv(1),ikeep1(1),ikeep2(1))
912 compress = -1
913 ENDIF
914 ENDIF
915#endif
916 IF (prok) THEN
917 IF (iord.EQ.1) THEN
918 WRITE(mp,'(A)') ' Ordering given is used'
919 ENDIF
920 ENDIF
921 IF (iord.EQ.1 .OR. iord.EQ.5 .OR. compress.EQ.-1
922 & .OR. ( (iord.EQ.3).AND.(.NOT.scotch_symbolic) )
923 & .OR.
924 & ( (norig.NE.n).AND.present(sizeofblocks) .AND.(iord.EQ.3)
925 & .AND. (weightused.EQ.0)
926 & )
927 & ) THEN
928 IF ((keep(106).EQ.1).OR.(keep(106).EQ.2).OR.(keep(106).EQ.4)
929 & .OR.(keep(60).NE.0)) THEN
930 IF ( compress .EQ. -1 ) THEN
931 ALLOCATE(ipq8(n),stat=ierr)
932 IF ( ierr .GT. 0 ) THEN
933 info( 1 ) = -7
934 info( 2 ) = n*keep(10)
935 ENDIF
937 & ipe(1), ptrar(1,2),
938 & ipq8, iwl1, iwfr8, keep8(126), keep8(127),
939 & info(1), info(2), icntl, symmetry, keep(50),
940 & nbqd, avgdens, keep(264),keep(265), .true.,
941 & inplace64_graph_copy)
942 DEALLOCATE(ipq8)
943 ENDIF
944 compress = 0
945 IF (keep(106).EQ.2) THEN
946 IF (prok) THEN
947 WRITE(mp,*) " SYMBOLIC based on column counts "
948 ENDIF
949 IF (present(sizeofblocks)) THEN
950 DO i=1, n
951 frere(i) = sizeofblocks(i)
952 ENDDO
953 ELSE
954 frere(1) = -1
955 ENDIF
957 & n, ipe(1), iw(1), iwfr8,
958 & ikeep1(1),
959 & frere(1),
960 & keep(60), listvar_schur(1), size_schur,
961 & keep(378),
962 & iwl1, parent,
963 & ikeep2(1), ikeep3(1), nfsiz(1),
964 & ptrar(1,1), ptrar(1,2), ptrar(1,3),
965 & info )
966 IF (info(1).LT.0) GOTO 90
967 ELSE IF ((keep(106).EQ.4).AND.(keep(60).EQ.0).AND.
968 & (.NOT.present(sizeofblocks) .OR. (norig.EQ.n))
969 & ) THEN
970 WRITE(mp,*) " Undefined option for ICNTL(58) "
971 info(1)= -99998
972 GOTO 90
973 ELSE
974 ALLOCATE( wtemp( 2*n ), stat = ierr )
975 IF ( ierr .GT. 0 ) THEN
976 info( 1 ) = -7
977 info( 2 ) = 2*n
978 GOTO 90
979 ENDIF
980 thresh = -1
981 IF (keep(60) == 0) THEN
982 itemp = 0
983 ELSE
984 itemp = size_schur
985 ENDIF
986 agg6 =.false.
987 IF (present(sizeofblocks)) THEN
988 DO i=1, n
989 iwl1(i) = sizeofblocks(i)
990 ENDDO
991 totel = norig
992 ELSE
993 iwl1(1) = -1
994 totel = n
995 ENDIF
997 & n, totel, liw8, ipe(1), iwfr8, ptrar(1,2), iw(1),
998 & iwl1(1), wtemp(n+1),
999 & ikeep2(1), ncmpa, fils(1), ikeep3(1), ptrar,
1000 & ptrar(1,3),ikeep1(1), listvar_schur(1), itemp,
1001 & agg6, parent)
1002 DEALLOCATE(wtemp)
1003 ENDIF
1004 ELSE
1005 CALL smumps_ana_j(n, nz8, irn(1), icn(1), ikeep1(1), iw(1),
1006 & liw8, ipe(1),
1007 & ptrar(1,2), iwl1, iwfr8,
1008 & info(1),info(2), mp)
1009 IF (keep(60) .EQ. 0) THEN
1010 itemp = 0
1011 ELSE
1012 itemp = size_schur
1013 ENDIF
1014 CALL smumps_ana_k(n, ipe(1), iw(1), liw8, iwfr8, ikeep1(1),
1015 & ikeep2(1), iwl1,
1016 & ptrar, ncmpa, itemp, parent)
1017 ENDIF
1018 ENDIF
1019 IF (keep(60) .NE. 0) THEN
1020 IF (keep(60)==1) THEN
1021 keep(20) = listvar_schur(1)
1022 ELSE
1023 keep(38) = listvar_schur(1)
1024 ENDIF
1025 ENDIF
1026#if defined(OLDDFS)
1027 CALL smumps_ana_l
1028 & (n, parent, iwl1, ikeep1(1), ikeep2(1), ikeep3(1),
1029 & nfsiz, info(6), fils(1), frere(1), ptrar(1,3),
1030 & nemin, keep(60))
1031#else
1032 IF (allocated(ipealloc)) DEALLOCATE(ipealloc)
1033 ALLOCATE(wtemp(n), stat=ierr)
1034 IF ( ierr .GT. 0 ) THEN
1035 info( 1 ) = -7
1036 info( 2 ) = n
1037 GOTO 90
1038 ENDIF
1039 IF (present(sizeofblocks)) THEN
1041 & (n, parent, iwl1, ikeep1(1), ikeep2(1), ikeep3(1),
1042 & nfsiz(1), ptrar, info(6), fils(1), frere(1),
1043 & ptrar(1,3), nemin, wtemp, keep(60),
1044 & keep(20),keep(38),ptrar(1,2),keep(104),iw(1),keep(50),
1045 & icntl(13), keep(37), keep(197), nslaves, keep(250).EQ.1
1046 & , .true. , sizeofblocks, n
1047 & )
1048 ELSE
1050 & (n, parent, iwl1, ikeep1(1), ikeep2(1), ikeep3(1),
1051 & nfsiz(1), ptrar, info(6), fils(1), frere(1),
1052 & ptrar(1,3), nemin, wtemp, keep(60),
1053 & keep(20),keep(38),ptrar(1,2),keep(104),iw(1),keep(50),
1054 & icntl(13), keep(37), keep(197), nslaves, keep(250).EQ.1
1055 & , .false., idummy, lidummy )
1056 ENDIF
1057 DEALLOCATE(wtemp)
1058#endif
1059 IF (keep(60).NE.0) THEN
1060 IF (keep(60)==1) THEN
1061 in = keep(20)
1062 ELSE
1063 in = keep(38)
1064 ENDIF
1065 DO WHILE (in.GT.0)
1066 in = fils(in)
1067 END DO
1068 ifson = -in
1069 IF (keep(60)==1) THEN
1070 in = keep(20)
1071 ELSE
1072 in = keep(38)
1073 ENDIF
1074 DO i=2,size_schur
1075 fils(in) = listvar_schur(i)
1076 in = fils(in)
1077 frere(in) = n+1
1078 ENDDO
1079 fils(in) = -ifson
1080 ENDIF
1082 & ptrar(1,3), info(6),
1083 & info(5), keep(2), keep(50),
1084 & keep8(101), keep(108), keep(5),
1085 & keep(6), keep(226), keep(253))
1086 keep(59) = info(5)
1087 IF ( keep(53) .NE. 0 ) THEN
1089 & keep(20) )
1090 END IF
1091 IF ( (keep(48) == 4 .AND. keep8(21).GT.0_8)
1092 & .OR.
1093 & (keep(48)==5 .AND. keep8(21) .GT. 0_8 )
1094 & .OR.
1095 & (keep(24).NE.0.AND.keep8(21).GT.0_8) ) THEN
1097 & keep(48), keep(50), nslaves)
1098 END IF
1099 IF (keep(210).LT.0.OR.keep(210).GT.2) THEN
1100 keep(210)=0
1101 ENDIF
1102 IF (keep(210).EQ.0.AND.keep(201).GT.0) THEN
1103 keep(210)=1
1104 ENDIF
1105 IF (keep(210).EQ.0.AND.keep(201).EQ.0) THEN
1106 keep(210)=2
1107 ENDIF
1108 IF (keep(210).EQ.2) THEN
1109 keep8(79)=huge(keep8(79))
1110 ENDIF
1111 IF (keep(210).EQ.1.AND.keep8(79).LE.0_8) THEN
1112 keep8(79)=k79ref * int(nslaves,8)
1113 ENDIF
1114 IF ( (keep(79).EQ.0).OR.(keep(79).EQ.2).OR.
1115 & (keep(79).EQ.3).OR.(keep(79).EQ.5).OR.
1116 & (keep(79).EQ.6)
1117 & ) THEN
1118 IF (keep(210).EQ.1) THEN
1119 splitroot = .false.
1120 IF ( keep(62).GE.1) THEN
1121 iwl1(1) = -1
1122 IF (present(sizeofblocks)) THEN
1123 DO i= 1, n
1124 iwl1(i) = sizeofblocks(i)
1125 ENDDO
1126 ENDIF
1128 & iwl1(1), n, info(6),
1129 & nslaves, keep,keep8, splitroot,
1130 & mp, ldiag, info(1), info(2))
1131 IF (info(1).LT.0) GOTO 90
1132 IF (prok) THEN
1133 WRITE(mp,*) " Number of split nodes in pre-splitting=",
1134 & keep(61)
1135 ENDIF
1136 ENDIF
1137 ENDIF
1138 ENDIF
1139 splitroot = ((icntl(13).GT.0 .AND. nslaves.GT.icntl(13)) .OR.
1140 & icntl(13).EQ.-1 )
1141 IF (keep(53) .NE. 0) THEN
1142 splitroot = .true.
1143 ENDIF
1144 splitroot = (splitroot.AND.( (keep(60).EQ.0) ))
1145 IF (splitroot) THEN
1146 iwl1(1) = -1
1147 IF (present(sizeofblocks)) THEN
1148 DO i= 1, n
1149 iwl1(i) = sizeofblocks(i)
1150 ENDDO
1151 ENDIF
1153 & iwl1(1), n, info(6),
1154 & nslaves, keep,keep8, splitroot,
1155 & mp, ldiag, info(1), info(2))
1156 IF (info(1).LT.0) GOTO 90
1157 IF ( keep(53) .NE. 0 ) THEN
1159 & keep(20) )
1160 ENDIF
1161 ENDIF
1162 IF (ldiag.GT.2 .AND. mp.GT.0) THEN
1163 k = min0(10,n)
1164 IF (ldiag.EQ.4) k = n
1165 IF (k.GT.0) WRITE (mp,99987) (nfsiz(i),i=1,k)
1166 IF (k.GT.0) WRITE (mp,99989) (fils(i),i=1,k)
1167 IF (k.GT.0) WRITE (mp,99988) (frere(i),i=1,k)
1168 ENDIF
1169 GO TO 90
1170 90 CONTINUE
1171 IF (info(1) .NE. 0) THEN
1172 IF ((lp.GT.0).AND.(icntl(4).GE.1))
1173 & WRITE (lp,99996) info(1), info(2)
1174 ENDIF
1175 IF (allocated(iwalloc)) DEALLOCATE(iwalloc)
1176 IF (allocated(iwl1)) DEALLOCATE(iwl1)
1177 IF (allocated(ipealloc)) DEALLOCATE(ipealloc)
1178 IF (allocated(ptrar)) DEALLOCATE(ptrar)
1179 IF (allocated(parent)) DEALLOCATE(parent)
1180 RETURN
118199999 FORMAT (/'Entering ordering phase with ...'/
1182 & ' N NNZ LIW INFO(1)'/,
1183 & 6x, i10, i11, i12, i10)
118499998 FORMAT ('Matrix entries: IRN() ICN()'/
1185 & (i12, i9, i12, i9, i12, i9))
118699909 FORMAT (/'Entering ordering phase with graph dimensions ...'/
1187 & ' |V| |E| INFO(1)'/,
1188 & 10x, i10, i13, i10)
118999997 FORMAT ('IKEEP1(.)=', 10i8/(12x, 10i8))
119099996 FORMAT
1191 & (/'** Error/warning return ** from Analysis * INFO(1:2)= ',
1192 & (i3, i16))
119399989 FORMAT ('FILS (.) =', 10i9/(11x, 10i9))
119499988 FORMAT ('FRERE(.) =', 10i9/(11x, 10i9))
119599987 FORMAT ('NFSIZ(.) =', 10i9/(11x, 10i9))
subroutine mumps_wrap_ginp94(n, ipe, iw, liw8, perm, sizeofblocks, keep60, listvar_schur, size_schur, keep378, colcount, parent, porder, iwtmp1, iwtmp2, iwtmp3, iwtmp4, iwtmp5, info)
subroutine mumps_qamd(totel, compute_perm, iversion, thresh, ndense, n, iwlen, pe, pfree, len, iw, nv, elen, last, ncmpa, degree, head, next, w, parent)
subroutine mumps_ana_h(totel, compute_perm, n, iwlen, pe, pfree, len, iw, nv, elen, last, ncmpa, degree, head, next, w, parent)
subroutine mumps_symqamd(thresh, ndense, n, totel, iwlen, pe, pfree, len, iw, nv, elen, last, ncmpa, degree, head, next, w, perm, listvar_schur, size_schur, agg6, parent)
subroutine mumps_cst_amf(n, nbbuck, iwlen, pe, pfree, len, iw, nv, elen, last, ncmpa, degree, wf, next, w, head, constraint, theson, parent)
subroutine mumps_hamd(n, iwlen, pe, pfree, len, iw, nv, elen, last, ncmpa, degree, head, next, w, parent, listvar_schur, size_schur)
subroutine mumps_hamf4(norig, n, compute_perm, nbbuck, iwlen, pe, pfree, len, iw, nv, elen, last, ncmpa, degree, wf, next, w, head, parent)
subroutine mumps_set_ordering(n, keep, sym, nprocs, iord, nbqd, avgdens, prok, mp)
subroutine smumps_get_perm_from_pe(n, pe, invperm, nfils, work)
subroutine smumps_gnew_schur(na, n, nz, irn, icn, iw, lw, ipe, len, iq, flag, iwfr, nrorm, niorm, iflag, ierror, icntl, symmetry, sym, nbqd, avgdens, keep264, keep265, listvar_schur, size_schur, atoao, aotoa, inplace64_graph_copy)
subroutine smumps_expand_permutation(n, ncmp, n11, n22, piv, invperm, perm)
subroutine smumps_expand_perm_schur(na, ncmp, invperm, perm, listvar_schur, size_schur, aotoa)
subroutine smumps_ldlt_compress(n, nz, irn, icn, piv, ncmp, iw, lw, ipe, len, iq, flag, icmp, iwfr, ierror, keep, keep8, icntl, inplace64_graph_copy)
subroutine smumps_get_elim_tree(n, pe, nv, work)
subroutine smumps_set_constraints(n, piv, frere, fils, nfsiz, ikeep, ncst, keep, keep8, rowsca)
subroutine smumps_ana_j(n, nz, irn, icn, perm, iw, lw, ipe, iq, flag, iwfr, iflag, ierror, mp)
subroutine smumps_ana_m(ne, nd, nsteps, maxfr, maxelim, k50, sizefac_tot, maxnpiv, k5, k6, panel_size, k253)
subroutine smumps_ana_k(n, ipe, iw, lw, iwfr, ips, ipv, nv, flag, ncmpa, size_schur, parent)
subroutine smumps_ana_gnew(n, nz, irn, icn, iw, lw, ipe, len, iq, flag, iwfr, nrorm, niorm, iflag, ierror, icntl, symmetry, sym, nbqd, avgdens, keep264, keep265, printstat, inplace64_graph_copy)
subroutine smumps_set_k821_surface(keep821, keep2, keep48, keep50, nslaves)
subroutine smumps_ana_lnew(n, ipe, nv, ips, ne, na, nfsiz, node, nsteps, fils, frere, nd, nemin, subord, keep60, keep20, keep38, namalg, namalgmax, cumul, keep50, icntl13, keep37, keep197, nslaves, allow_amalg_tiny_nodes, blkon, sizeofblocks, lsizeofblocks)
subroutine smumps_cutnodes(n, frere, fils, nfsiz, sizeofblocks, lsizeofblocks, nsteps, nslaves, keep, keep8, splitroot, mp, ldiag, info1, info2)