23 & IKEEP1, IKEEP2, IKEEP3,
24 & IORD, NFSIZ, FILS, FRERE, LISTVAR_SCHUR, SIZE_SCHUR,
25 & ICNTL, INFO, KEEP,KEEP8, NSLAVES, PIV,
26 & CNTL4, COLSCA, ROWSCA
27#if defined(metis) || defined(parmetis) || defined(metis4) || defined(parmetis3)
30 & , norig_arg, sizeofblocks, gcomp_provided_in, gcomp
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(:)
48 REAL,
POINTER :: COLSCA(:), ROWSCA(:)
49#if defined(metis) || defined(parmetis) || defined(metis4) || defined(parmetis3)
50 INTEGER,
INTENT(IN) :: METIS_OPTIONS(40)
52 INTEGER,
INTENT(IN),
OPTIONAL :: NORIG_ARG
53 INTEGER,
INTENT(IN),
OPTIONAL :: SIZEOFBLOCKS(N)
54 LOGICAL,
INTENT(IN),
OPTIONAL :: GCOMP_PROVIDED_IN
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
65 INTEGER,
DIMENSION(:),
ALLOCATABLE :: WTEMP
67 INTEGER I, K, NCMPA, IN, IFSON
70 INTEGER(8) :: IFIRST, ILAST
72 INTEGER NEMIN, LP, MP, LDIAG, ITEMP, symmetry
74 LOGICAL PROK, , LPOK, COMPUTE_PERM
75#if defined(metis) || defined(parmetis) || defined(metis4) || defined(parmetis3)
76#if defined(metis4) || defined(parmetis3)
79 INTEGER METIS_IDX_SIZE
80 INTEGER OPT_METIS_SIZE
82#
if defined(scotch) || defined(ptscotch)
83 INTEGER :: SCOTCH_INT_SIZE
86 INTEGER :: PORD_INT_SIZE
88 REAL,
DIMENSION(:),
ALLOCATABLE :: COLSCA_TEMP
89 INTEGER THRESH, IVersion
94 parameter(k79ref=12000000_8)
95 INTEGER,
PARAMETER :: LIDUMMY = 1
97 INTEGER MTRANS, COMPRESS,NCMP,IERROR,J,JPERM,NCST
103#if defined(scotch) || defined(ptscotch)
104 INTEGER WEIGHTREQUESTED
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
117 EXTERNAL cmumps_ana_l
122 IF (liwalloc.GT.0_8)
THEN
123 ALLOCATE( iwalloc(liwalloc), stat = ierr )
124 IF ( ierr .GT. 0 )
THEN
130 ALLOCATE( iwl1(n), stat = ierr )
131 IF ( ierr .GT. 0 )
THEN
136 ALLOCATE( ipealloc(n+1), stat = ierr )
137 IF ( ierr .GT. 0 )
THEN
139 info( 2 ) = (n+1)*keep(10)
142 ALLOCATE( ptrar(n,3), stat = ierr )
143 IF ( ierr .GT. 0 )
THEN
148 scotch_symbolic=(keep(270).EQ.0)
151 gcomp_provided=.false.
154 IF (
present(norig_arg))
THEN
157 IF (
present(gcomp_provided_in))
158 & gcomp_provided = gcomp_provided_in
159 IF (gcomp_provided.AND.(.NOT.
present(gcomp)))
THEN
161 WRITE(6,*)
" INTERNAL ERROR in MUMPS(ANA_F) ",
162 & gcomp_provided_in,
present(gcomp)
166 IF ( (liwalloc.EQ.0_8).AND.(.not.gcomp_provided))
THEN
168 WRITE(6,*)
" INTERNAL ERROR in MUMPS(ANA_F) ",
169 &
"LIWALLOC, GCOMP_PROVIDED=", liwalloc, gcomp_provided
173 IF (gcomp_provided)
THEN
175 liw8 = nzg8 + int(gcomp%NG,8)+1_8
176 iw => gcomp%ADJ(1:liw8)
177 ipe => gcomp%IPE(1:gcomp%NG+1)
179 ptrar(i,2) = int(ipe(i+1)-ipe(i))
184 iw => iwalloc(1:liw8)
185 ipe => ipealloc(1:n+1)
189 lpok = ((lp.GT.0).AND.(icntl(4).GE.1))
190 prok = ((mp.GT.0).AND.(icntl(4).GE.2))
192 compress_schur = .false.
194 IF (
present(gcomp))
THEN
195 WRITE(mp,
'(A,I10,A,I13,A)')
" Processing a graph of size:", n
196 & ,
" with ", gcomp%NZG,
" edges"
198 WRITE(mp,
'(A,I10)')
" Processing a graph of size:", n
201 IF (gcomp_provided)
THEN
202 free_centralized_matrix = .false.
204 free_centralized_matrix = (
205 & (keep(54).EQ.3).AND.
206 & (keep(494).EQ.0).AND.
210 inplace64_graph_copy = .false.
211 inplace64_restore_graph = .true.
212 IF (keep(1).LT.0) keep(1) = 0
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)
220 WRITE(mp,
'(A)')
" Graph adjacency "
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)
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)
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)
241 IF (keep(60).NE.0)
THEN
242 IF ((size_schur.LE.0 ).OR.
243 & (size_schur.GE.n) )
GOTO 90
245#if defined(metis) || defined(parmetis) || defined(metis4) || defined(parmetis3)
246 IF ( ( keep(60).NE.0).AND.(size_schur.GT.0)
248 & ((iord.EQ.7).OR.(iord.EQ.5))
250 compress_schur=.true.
252 ALLOCATE(ipq8(n),stat=ierr)
253 IF ( ierr .GT. 0 )
THEN
255 info( 2 ) = n*keep(10)
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)
266 inplace64_graph_copy = inplace64_graph_copy.AND.
267 & (.NOT.free_centralized_matrix)
274 IF (gcomp_provided)
THEN
275 iwfr8 = gcomp%NZG+1_8
277 ALLOCATE(ipq8(n),stat=ierr)
278 IF ( ierr .GT. 0 )
THEN
280 info( 2 ) = n*keep(10)
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)
292 inplace64_graph_copy = inplace64_graph_copy.AND.
293 & (.NOT.free_centralized_matrix)
296#if defined(metis) || defined(parmetis) || defined(metis4) || defined(parmetis3)
300 IF( keep(50) .EQ. 2 .AND. icntl(12) .EQ. 0 )
THEN
301 IF(keep(95) .NE. 1)
THEN
304 &
'Compressed/constrained ordering set OFF'
309 IF ( (keep(60).NE.0) .AND. (iord.GT.1) .AND.
310 & .NOT. compress_schur )
THEN
314 & .AND. (keep(95) .EQ. 3)
315 & .AND. (iord .EQ. 7) )
THEN
319 & keep(50), nslaves, iord,
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: CMUMPS_ANA_F constrained ordering not '//
326 &
' available with selected ordering. Move to' //
327 &
' compressed ordering.'
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
344 IF(mtrans .GT. 0 .AND. keep(50) .EQ. 2)
THEN
347 IF (compress .EQ. 2)
THEN
349 WRITE(*,*)
"IORD not compatible with COMPRESS:",
354 & n,piv(1),frere(1),fils(1),nfsiz(1),ikeep1(1),
355 & ncst,keep,keep8, rowsca(1)
358 IF ( iord .NE. 1 )
THEN
359 IF (compress .GE. 1)
THEN
360 ALLOCATE(ipq8(n),stat=ierr)
361 IF ( ierr .GT. 0 )
THEN
363 info( 2 ) = n*keep(10)
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)
373 IF ( (symmetry.LT.minsym).AND.(keep(50).EQ.0) )
THEN
374 IF(keep(23) .EQ. 7 )
THEN
377 ELSE IF(keep(23) .EQ. -9876543)
THEN
380 IF (prok)
WRITE(mp,
'(A)')
381 &
' ... Apply column permutation (already computed)'
385 IF (jperm.NE.j) ident = .false.
390 IF ((j.LE.0).OR.(j.GT.n)) cycle
393 ALLOCATE(colsca_temp(n), stat=ierr)
400 colsca_temp(j)=colsca(j)
403 colsca(fils(j))=colsca_temp(j)
405 DEALLOCATE(colsca_temp)
408 &
' WARNING input matrix data modified'
409 ALLOCATE(ipq8(n),stat=ierr)
410 IF ( ierr .GT. 0 )
THEN
412 info( 2 ) = n*keep(10)
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)
428 ELSE IF (keep(23) .EQ. 7 .OR. keep(23) .EQ. -9876543 )
THEN
429 IF (prok)
WRITE(mp,
'(A)')
430 &
' ... No column permutation'
434 IF (free_centralized_matrix
435 & .AND.compress.EQ.0.AND.(.NOT.compress_schur))
THEN
441 inplace64_restore_graph =
442 & inplace64_restore_graph.AND.(compress.NE.1)
443 ALLOCATE( parent( n ), stat = ierr )
444 IF ( ierr .GT. 0 )
THEN
449 IF (iord.NE.1 .AND. iord.NE.5)
THEN
450 IF ( keep(60) .NE. 0 )
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 '
461 ELSE IF (iord.EQ.4)
THEN
462 WRITE(mp,
'(A)')
' Ordering based on PORD '
464 ELSE IF (iord.EQ.6)
THEN
465 WRITE(mp,
'(A)')
' Ordering based on QAMD '
467 WRITE(mp,
'(A)')
' Ordering based on AMD '
473 IF ( keep(60) .NE. 0 )
THEN
474 CALL mumps_hamd(n, liw8, ipe(1), iwfr8, ptrar(1,2), iw(1),
476 & ikeep2(1), ncmpa, fils(1), ikeep3(1),
479 & listvar_schur(1), size_schur)
480 IF (keep(60)==1)
THEN
481 keep(20) = listvar_schur(1)
483 keep(38) = listvar_schur(1)
488 ELSEIF (iord .EQ. 4)
THEN
489 CALL mumps_pord_intsize(pord_int_size)
491 IF ( (compress .EQ. 1)
493 & ( (norig.NE.n).AND.
present(sizeofblocks) )
495 IF (compress .EQ. 1)
THEN
499 DO i=1+keep(93)/2,ncmp
503 & ( (norig.NE.n).AND.
present(sizeofblocks) )
THEN
506 iwl1(i) = sizeofblocks(i)
509 IF (pord_int_size .EQ. 64)
THEN
510 CALL mumps_pordf_wnd_mixedto64(ncmp, iwfr8-1_8,
512 & iwl1, ncmpa, totw, parent,
513 & info(1), lp, lpok, keep(10),
514 & inplace64_graph_copy
516 ELSE IF (pord_int_size .EQ. 32)
THEN
517 CALL mumps_pordf_wnd_mixedto32(ncmp, iwfr8-1_8,
519 & iwl1, ncmpa, totw, parent,
520 & info(1), lp, lpok, keep(10))
523 &
"Internal error in PORD wrappers, PORD_INT_SIZE=",
527 IF ( ncmpa .NE. 0 )
THEN
528 write(6,*)
' Out PORD, NCMPA=', ncmpa
533 IF (info(1) .LT.0)
GOTO 90
534 IF (compress.EQ.1)
THEN
537 & frere(1),ptrar(1,1))
543 IF (pord_int_size.EQ.64)
THEN
544 CALL mumps_pordf_mixedto64(ncmp, iwfr8-1_8, ipe,
546 & iwl1, ncmpa, parent,
547 & info(1), lp, lpok, keep(10),
548 & inplace64_graph_copy
550 ELSE IF (pord_int_size.EQ.32)
THEN
551 CALL mumps_pordf_mixedto32(ncmp, iwfr8-1_8, ipe,
553 & iwl1, ncmpa, parent,
554 & info(1), lp, lpok, keep(10))
557 &
"Internal error in PORD wrappers, PORD_INT_SIZE=",
562 IF ( ncmpa .NE. 0 )
THEN
563 write(6,*)
' Out PORD, NCMPA=', ncmpa
568 IF (info(1) .LT. 0)
GOTO 90
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)
575 & ( (norig.NE.n).AND.
present(sizeofblocks) )
578 IF (compress .EQ. 1)
THEN
582 DO i=1+keep(93)/2,ncmp
586 & ( (norig.NE.n).AND.
present(sizeofblocks) )
THEN
588 iwl1(i) = sizeofblocks(i)
597 IF (scotch_int_size.EQ.32)
THEN
598 IF (keep(10).EQ.1)
THEN
602 CALL mumps_scotch_mixedto32(ncmp,
605 & ptrar(1,2), iw, iwl1, ikeep1,
606 & ikeep2, ncmpa, info, lp, lpok,
607 & weightused, weightrequested, scotch_symbolic)
609 ELSE IF (scotch_int_size.EQ.64)
THEN
610 CALL mumps_scotch_mixedto64(ncmp,
613 & ptrar(1,2), iw, iwl1, ikeep1,
614 & ikeep2, ncmpa, info, lp, lpok, keep(10),
615 & inplace64_graph_copy
616 & weightused, weightrequested, scotch_symbolic)
619 &
"Internal error in SCOTCH wrappers, SCOTCH_INT_SIZE=",
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))
630 ELSE IF ( (compress .EQ. 1)
632 & ( (norig.NE.n).AND.
present(sizeofblocks).AND.
633 & (weightused.EQ.0) )
637 & frere(1),ptrar(1,1))
643 ELSEIF (iord .EQ. 2)
THEN
646 IF(compress .GE. 1)
THEN
651 DO i=1+keep(93)/2,ncmp
654 totel = keep(93)+keep(94)
659 IF (
present(sizeofblocks))
THEN
660 IF (compress.GE.1)
THEN
663 nbbuck =
max(nbbuck, norig-n)
664 nbbuck =
max(nbbuck, 2*norig)
668 iwl1(i) = sizeofblocks(i)
671 ALLOCATE( wtemp( 0: nbbuck + 1), stat = ierr )
672 IF ( ierr .GT. 0 )
THEN
677 IF(compress .LE. 1)
THEN
679 & (totel, ncmp, compute_perm, nbbuck, liw8, ipe(1),
681 & iw(1), iwl1, ikeep1(1), ikeep2(1), ncmpa, fils(1),
682 & ikeep3(1), ptrar, ptrar(1,3), wtemp, parent(1))
684 IF(prok)
WRITE(mp,
'(A)')
685 &
' Constrained Ordering based on AMF'
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))
693 ELSEIF (iord .EQ. 6)
THEN
694 ALLOCATE( wtemp( n ), stat = ierr )
695 IF ( ierr .GT. 0 )
THEN
703 IF(compress .EQ. 1)
THEN
708 DO i=1+keep(93)/2,ncmp
711 totel = keep(93)+keep(94)
716 IF (
present(sizeofblocks))
THEN
717 IF (compress.EQ.1)
THEN
723 iwl1(i) = sizeofblocks(i)
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))
734 IF(compress .EQ. 1)
THEN
739 DO i=1+keep(93)/2,ncmp
742 totel = keep(93)+keep(94)
747 IF (
present(sizeofblocks))
THEN
748 IF (compress.EQ.1)
THEN
754 iwl1(i) = sizeofblocks(i)
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))
763 IF(compress .GE. 1)
THEN
765 & piv(1),ikeep1(1),ikeep2(1))
770#if defined(scotch) || defined(ptscotch)
772 WRITE( mp,
'(A,F12.4)' )
773 &
' ELAPSED TIME SPENT IN SCOTCH reordering =', timeb
778#if defined(metis) || defined(parmetis) || defined(metis4) || defined(parmetis3)
781 WRITE(mp,
'(A)')
' Ordering based on METIS'
786 CALL mumps_metis_idxsize(metis_idx_size)
787 IF (keep(10).EQ.1.AND.metis_idx_size.NE.64)
THEN
792#if defined(metis4) || defined(parmetis3)
798 IF (compress .EQ. 1)
THEN
802 DO i=keep(93)/2+1,ncmp
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 )
819 &
"Internal error in METIS wrappers, METIS_IDX_SIZE=",
824 IF ((norig.NE.n).AND.
present(sizeofblocks))
THEN
826 frere(i) = sizeofblocks(i)
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 )
841 &
"Internal error in METIS wrappers, METIS_IDX_SIZE=",
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)
860 &
"Internal error in METIS wrappers, METIS_IDX_SIZE=",
868 IF (
present(sizeofblocks))
THEN
870 frere(i) = sizeofblocks(i)
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)
891 IF (lpok)
WRITE(lp,*)
892 &
"Internal error in METIS wrappers, METIS_IDX_SIZE=",
897 IF (info(1) .LT.0)
GOTO 90
900 WRITE( mp,
'(A,F12.4)' )
901 &
' ELAPSED TIME SPENT IN METIS reordering =', timeb
903 IF ( compress_schur )
THEN
905 & n, ncmp, ikeep1(1),ikeep2(1),
906 & listvar_schur(1), size_schur, fils(1))
909 IF (compress .EQ. 1)
THEN
911 & keep(93),piv(1),ikeep1(1),ikeep2(1))
918 WRITE(mp,
'(A)')
' Ordering given is used'
921 IF (iord.EQ.1 .OR. iord.EQ.5 .OR. compress.EQ.-1
922 & .OR. ( (iord.EQ.3).AND.(.NOT.scotch_symbolic) )
924 & ( (norig.NE.n).AND.
present(sizeofblocks) .AND.(iord.EQ.3)
925 & .AND. (weightused.EQ.0)
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
934 info( 2 ) = n*keep(10)
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)
945 IF (keep(106).EQ.2)
THEN
947 WRITE(mp,*) " symbolic based on column counts
"
949 IF (present(SIZEOFBLOCKS)) THEN
951 FRERE(I) = SIZEOFBLOCKS(I)
956 CALL MUMPS_WRAP_GINP94 (
957 & N, IPE(1), IW(1), IWFR8,
960 & KEEP(60), LISTVAR_SCHUR(1), SIZE_SCHUR,
963 & IKEEP2(1), IKEEP3(1), NFSIZ(1),
964 & PTRAR(1,1), PTRAR(1,2), PTRAR(1,3),
966.LT.
IF (INFO(1)0) GOTO 90
967.EQ..AND..EQ..AND.
ELSE IF ((KEEP(106)4)(KEEP(60)0)
968.NOT..OR..EQ.
& (present(SIZEOFBLOCKS) (NORIGN))
970 WRITE(MP,*) " undefined option
for icntl(58)
"
974 ALLOCATE( WTEMP ( 2*N ), stat = IERR )
975.GT.
IF ( IERR 0 ) THEN
981 IF (KEEP(60) == 0) THEN
987 IF (present(SIZEOFBLOCKS)) THEN
989 IWL1(I) = SIZEOFBLOCKS(I)
996 CALL MUMPS_SYMQAMD(THRESH, WTEMP,
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,
1005 CALL CMUMPS_ANA_J(N, NZ8, IRN(1), ICN(1), IKEEP1(1), IW(1),
1007 & PTRAR(1,2), IWL1, IWFR8,
1008 & INFO(1),INFO(2), MP)
1009.EQ.
IF (KEEP(60) 0) THEN
1014 CALL CMUMPS_ANA_K(N, IPE(1), IW(1), LIW8, IWFR8, IKEEP1(1),
1016 & PTRAR, NCMPA, ITEMP, PARENT)
1019.NE.
IF (KEEP(60) 0) THEN
1020 IF (KEEP(60)==1) THEN
1021 KEEP(20) = LISTVAR_SCHUR(1)
1023 KEEP(38) = LISTVAR_SCHUR(1)
1028 & (N, PARENT, IWL1, IKEEP1(1), IKEEP2(1), IKEEP3(1),
1029 & NFSIZ, INFO(6), FILS(1), FRERE(1), PTRAR(1,3),
1032 IF (allocated(IPEALLOC)) DEALLOCATE(IPEALLOC)
1033 ALLOCATE(WTEMP(N), stat=IERR)
1034.GT.
IF ( IERR 0 ) THEN
1039 IF (present(SIZEOFBLOCKS)) THEN
1040 CALL CMUMPS_ANA_LNEW
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.EQ.
& ICNTL(13), KEEP(37), KEEP(197), NSLAVES, KEEP(250)1
1046 & , .TRUE. , SIZEOFBLOCKS, N
1049 CALL CMUMPS_ANA_LNEW
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.EQ.
& ICNTL(13), KEEP(37), KEEP(197), NSLAVES, KEEP(250)1
1055 & , .FALSE., IDUMMY, LIDUMMY )
1059.NE.
IF (KEEP(60)0) THEN
1060 IF (KEEP(60)==1) THEN
1069 IF (KEEP(60)==1) THEN
1075 FILS(IN) = LISTVAR_SCHUR (I)
1081 CALL CMUMPS_ANA_M(IKEEP2(1),
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))
1087.NE.
IF ( KEEP(53) 0 ) THEN
1088 CALL MUMPS_MAKE1ROOT( N, FRERE(1), FILS(1), NFSIZ(1),
1091.AND..GT.
IF ( (KEEP(48) == 4 KEEP8(21)0_8)
1093.AND..GT.
& (KEEP (48)==5 KEEP8(21) 0_8 )
1095.NE..AND..GT.
& (KEEP(24)0KEEP8(21)0_8) ) THEN
1096 CALL CMUMPS_SET_K821_SURFACE(KEEP8(21), KEEP(2),
1097 & KEEP(48), KEEP(50), NSLAVES)
1099.LT..OR..GT.
IF (KEEP(210)0KEEP(210)2) THEN
1102.EQ..AND..GT.
IF (KEEP(210)0KEEP(201)0) THEN
1105.EQ..AND..EQ.
IF (KEEP(210)0KEEP(201)0) THEN
1108.EQ.
IF (KEEP(210)2) THEN
1109 KEEP8(79)=huge(KEEP8(79))
1111.EQ..AND..LE.
IF (KEEP(210)1KEEP8(79)0_8) THEN
1112 KEEP8(79)=K79REF * int(NSLAVES,8)
1114.EQ..OR..EQ..OR.
IF ( (KEEP(79)0)(KEEP(79)2)
1115.EQ..OR..EQ..OR.
& (KEEP(79)3)(KEEP(79)5)
1118.EQ.
IF (KEEP(210)1) THEN
1120.GE.
IF ( KEEP(62)1) THEN
1122 IF (present(SIZEOFBLOCKS)) THEN
1124 IWL1(I) = SIZEOFBLOCKS(I)
1127 CALL CMUMPS_CUTNODES(N, FRERE(1), FILS(1), NFSIZ(1),
1128 & IWL1(1), N, INFO(6),
1129 & NSLAVES, KEEP,KEEP8, SPLITROOT,
1130 & MP, LDIAG, INFO(1), INFO(2))
1131.LT.
IF (INFO(1)0) GOTO 90
1133 WRITE(MP,*) " number of
split nodes in pre-splitting=
",
1139.GT..AND..GT..OR.
SPLITROOT = ((ICNTL(13)0 NSLAVESICNTL(13))
1141.NE.
IF (KEEP(53) 0) THEN
1144.AND..EQ.
SPLITROOT = (SPLITROOT( (KEEP(60)0) ))
1147 IF (present(SIZEOFBLOCKS)) THEN
1149 IWL1(I) = SIZEOFBLOCKS(I)
1152 CALL CMUMPS_CUTNODES(N, FRERE(1), FILS(1), NFSIZ(1),
1153 & IWL1(1), N, INFO(6),
1154 & NSLAVES, KEEP,KEEP8, SPLITROOT,
1155 & MP, LDIAG, INFO(1), INFO(2))
1156.LT.
IF (INFO(1)0) GOTO 90
1157.NE.
IF ( KEEP(53) 0 ) THEN
1158 CALL MUMPS_MAKE1ROOT( N, FRERE(1), FILS(1), NFSIZ(1),
1162.GT..AND..GT.
IF (LDIAG2 MP0) THEN
1164.EQ.
IF (LDIAG4) K = N
1165.GT.
IF (K0) WRITE (MP,99987) (NFSIZ(I),I=1,K)
1166.GT.
IF (K0) WRITE (MP,99989) (FILS(I),I=1,K)
1167.GT.
IF (K0) WRITE (MP,99988) (FRERE(I),I=1,K)
1171.NE.
IF (INFO(1) 0) THEN
1172.GT..AND..GE.
IF ((LP0)(ICNTL(4)1))
1173 & WRITE (LP,99996) INFO(1), INFO(2)
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)
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))
1191 & (/'** Error/warning return ** from Analysis * INFO(1:2)= ',
119399989 FORMAT ('FILS (.) =', 10I9/(11X, 10I9))
119499988 FORMAT ('FRERE(.) =', 10I9/(11X, 10I9))
119599987 FORMAT ('NFSIZ(.) =', 10I9/(11X, 10I9))