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, COMPRESS_SCHUR, 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)
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.EQ.
ELSE IF (IORD6) THEN
465 WRITE(MP,'(a)
') ' ordering based on qamd
'
467 WRITE(MP,'(a)
') ' ordering based on amd
'
471 CALL MUMPS_SECDEB( TIMEB )
473.NE.
IF ( KEEP(60) 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.EQ.
ELSEIF (IORD 4) THEN
489 CALL MUMPS_PORD_INTSIZE(PORD_INT_SIZE)
491.EQ.
IF ( (COMPRESS 1)
493.NE..AND.
& ( (NORIGN)present(SIZEOFBLOCKS) )
495.EQ.
IF (COMPRESS 1) THEN
499 DO I=1+KEEP(93)/2,NCMP
503.NE..AND.
& ( (NORIGN)present(SIZEOFBLOCKS) ) THEN
506 IWL1(I) = SIZEOFBLOCKS(I)
509.EQ.
IF (PORD_INT_SIZE 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.EQ.
ELSE IF (PORD_INT_SIZE 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.NE.
IF ( NCMPA 0 ) THEN
528 write(6,*) ' out pord, ncmpa=
', NCMPA
533.LT.
IF (INFO(1) 0) GOTO 90
534.EQ.
IF (COMPRESS1) THEN
535 CALL CMUMPS_GET_ELIM_TREE(NCMP,PARENT,IWL1,FILS(1))
536 CALL CMUMPS_GET_PERM_FROM_PE(NCMP,PARENT,IKEEP1(1),
537 & FRERE(1),PTRAR(1,1))
543.EQ.
IF (PORD_INT_SIZE64) 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.EQ.
ELSE IF (PORD_INT_SIZE32) 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.NE.
IF ( NCMPA 0 ) THEN
563 write(6,*) ' out pord, ncmpa=
', NCMPA
568.LT.
IF (INFO(1) 0) GOTO 90
570#if defined(scotch) || defined(ptscotch)
571.EQ.
ELSEIF (IORD 3) THEN
572 CALL MUMPS_SCOTCH_INTSIZE(SCOTCH_INT_SIZE)
573.EQ.
IF ( (COMPRESS 1)
575.NE..AND.
& ( (NORIGN)present(SIZEOFBLOCKS) )
578.EQ.
IF (COMPRESS 1) THEN
582 DO I=1+KEEP(93)/2,NCMP
586.NE..AND.
& ( (NORIGN)present(SIZEOFBLOCKS) ) THEN
588 IWL1(I) = SIZEOFBLOCKS(I)
597.EQ.
IF (SCOTCH_INT_SIZE32) THEN
598.EQ.
IF (KEEP(10)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.EQ.
ELSE IF (SCOTCH_INT_SIZE64) 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.LT.
IF (INFO(1) 0) GOTO 90
624.NOT.
IF ( SCOTCH_SYMBOLIC) THEN
625.EQ.
IF ( COMPRESS 1 ) THEN
626 CALL CMUMPS_EXPAND_PERMUTATION(N,NCMP,KEEP(94),
627 & KEEP(93),PIV(1),IKEEP1(1),IKEEP2(1))
630.EQ.
ELSE IF ( (COMPRESS 1)
632.NE..AND..AND.
& ( (NORIGN)present(SIZEOFBLOCKS)
633.EQ.
& (WEIGHTUSED0) )
635 CALL CMUMPS_GET_ELIM_TREE(NCMP,PARENT,IWL1,FILS(1))
636 CALL CMUMPS_GET_PERM_FROM_PE(NCMP,PARENT,IKEEP1(1),
637 & FRERE(1),PTRAR(1,1))
643.EQ.
ELSEIF (IORD 2) THEN
646.GE.
IF(COMPRESS 1) THEN
651 DO I=1+KEEP(93)/2,NCMP
654 TOTEL = KEEP(93)+KEEP(94)
659 IF (present(SIZEOFBLOCKS)) THEN
660.GE.
IF (COMPRESS1) 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.GT.
IF ( IERR 0 ) THEN
677.LE.
IF(COMPRESS 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
'
686 CALL MUMPS_CST_AMF(NCMP, NBBUCK, LIW8, IPE(1),
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.EQ.
ELSEIF (IORD 6) THEN
694 ALLOCATE( WTEMP ( N ), stat = IERR )
695.GT.
IF ( IERR 0 ) THEN
703.EQ.
IF(COMPRESS 1) THEN
708 DO I=1+KEEP(93)/2,NCMP
711 TOTEL = KEEP(93)+KEEP(94)
716 IF (present(SIZEOFBLOCKS)) THEN
717.EQ.
IF (COMPRESS1) 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.EQ.
IF(COMPRESS 1) THEN
739 DO I=1+KEEP(93)/2,NCMP
742 TOTEL = KEEP(93)+KEEP(94)
747 IF (present(SIZEOFBLOCKS)) THEN
748.EQ.
IF (COMPRESS1) THEN
754 IWL1(I) = SIZEOFBLOCKS(I)
757 CALL MUMPS_ANA_H(TOTEL, COMPUTE_PERM,
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.GE.
IF(COMPRESS 1) THEN
764 CALL CMUMPS_EXPAND_PERMUTATION(N,NCMP,KEEP(94),KEEP(93),
765 & PIV(1),IKEEP1(1),IKEEP2(1))
769 CALL MUMPS_SECFIN( TIMEB )
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
'
784 CALL MUMPS_SECDEB( TIMEB )
786 CALL MUMPS_METIS_IDXSIZE(METIS_IDX_SIZE)
787.EQ..AND..NE.
IF (KEEP(10)1METIS_IDX_SIZE64) THEN
792#if defined(metis4) || defined(parmetis3)
798.EQ.
IF (COMPRESS 1) THEN
802 DO I=KEEP(93)/2+1,NCMP
805#if defined(metis4) || defined(parmetis3)
806.EQ.
IF (METIS_IDX_SIZE 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.EQ.
ELSE IF (METIS_IDX_SIZE 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.NE..AND.
IF ((NORIGN)present(SIZEOFBLOCKS)) THEN
826 FRERE(I) = SIZEOFBLOCKS(I)
828.EQ.
IF (METIS_IDX_SIZE 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.EQ.
ELSE IF (METIS_IDX_SIZE 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.EQ.
IF (METIS_IDX_SIZE 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.EQ.
ELSE IF (METIS_IDX_SIZE 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.EQ.
IF (METIS_IDX_SIZE 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.EQ.
ELSE IF (METIS_IDX_SIZE 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.LT.
IF (INFO(1) 0) GOTO 90
899 CALL MUMPS_SECFIN( TIMEB )
900 WRITE( MP, '(a,f12.4)
' )
901 & ' elapsed time spent in metis reordering =
', TIMEB
903 IF ( COMPRESS_SCHUR ) THEN
904 CALL CMUMPS_EXPAND_PERM_SCHUR(
905 & N, NCMP, IKEEP1(1),IKEEP2(1),
906 & LISTVAR_SCHUR(1), SIZE_SCHUR, FILS(1))
909.EQ.
IF (COMPRESS 1) THEN
910 CALL CMUMPS_EXPAND_PERMUTATION(N,NCMP,KEEP(94),
911 & KEEP(93),PIV(1),IKEEP1(1),IKEEP2(1))
918 WRITE(MP,'(a)
') ' ordering given is used
'
921.EQ..OR..EQ..OR..EQ.
IF (IORD1 IORD5 COMPRESS-1
922.OR..EQ..AND..NOT.
& ( (IORD3)(SCOTCH_SYMBOLIC) )
924.NE..AND..AND..EQ.
& ( (NORIGN)present(SIZEOFBLOCKS) (IORD3)
925.AND..EQ.
& (WEIGHTUSED0)
928.EQ..OR..EQ..OR..EQ.
IF ((KEEP(106)1)(KEEP(106)2)(KEEP(106)4)
929.OR..NE.
& (KEEP(60)0)) THEN
930.EQ.
IF ( COMPRESS -1 ) THEN
931 ALLOCATE(IPQ8(N),stat=IERR)
932.GT.
IF ( IERR 0 ) THEN
934 INFO( 2 ) = N*KEEP(10)
936 CALL CMUMPS_ANA_GNEW(N,NZ8,IRN(1),ICN(1),IW(1),LIW8,
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.EQ.
IF (KEEP(106)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))
1196 END SUBROUTINE CMUMPS_ANA_F
1197 SUBROUTINE CMUMPS_ANA_N_DIST( id, PTRAR )
1198 USE CMUMPS_STRUC_DEF, ONLY : CMUMPS_STRUC
1201 TYPE(CMUMPS_STRUC), INTENT(INOUT), TARGET :: id
1202 INTEGER(8), INTENT(OUT), TARGET :: PTRAR(:)
1203 INTEGER :: IERR, allocok
1204 INTEGER :: IOLD, JOLD, INEW, JNEW
1205 INTEGER(8) :: K, INZ
1206 INTEGER, POINTER :: IIRN(:), IJCN(:)
1207 INTEGER(8), POINTER :: IWORK1(:), IWORK2(:)
1209.EQ.
IF(id%KEEP(54) 3) THEN
1213 IWORK1 => PTRAR(id%N+1:id%N+id%N)
1214 allocate(IWORK2(id%N),stat=allocok)
1215 IF (allocok > 0 ) THEN
1225 IWORK1 => PTRAR(1:id%N)
1226 IWORK2 => PTRAR(id%N+1:id%N+id%N)
1237.GT..OR..GT..OR..LT.
IF ( (IOLDid%N)(JOLDid%N)(IOLD1)
1238.OR..LT.
& (JOLD1) ) GOTO 70
1239.NE.
IF (IOLDJOLD) THEN
1240 INEW = id%SYM_PERM(IOLD)
1241 JNEW = id%SYM_PERM(JOLD)
1242.EQ.
IF ( id%KEEP( 50 ) 0 ) THEN
1243.LT.
IF (INEWJNEW) THEN
1244 IWORK2(IOLD) = IWORK2(IOLD) + 1_8
1246 IWORK1(JOLD) = IWORK1(JOLD) + 1_8
1249.LT.
IF ( INEW JNEW ) THEN
1250 IWORK1( IOLD ) = IWORK1( IOLD ) + 1_8
1252 IWORK1( JOLD ) = IWORK1( JOLD ) + 1_8
1258.EQ.
IF (id%KEEP(54) 3) THEN
1259 CALL MPI_ALLREDUCE(IWORK1(1), PTRAR(1), id%N,
1260 & MPI_INTEGER8, MPI_SUM, id%COMM, IERR )
1261 CALL MPI_ALLREDUCE(IWORK2(1), PTRAR(id%N+1), id%N,
1262 & MPI_INTEGER8, MPI_SUM, id%COMM, IERR )
1265 CALL MPI_BCAST( PTRAR(1), 2*id%N, MPI_INTEGER8,
1266 & 0, id%COMM, IERR )
1269 END SUBROUTINE CMUMPS_ANA_N_DIST
1270 SUBROUTINE CMUMPS_ANA_O( N, NZ, MTRANS, PERM, IKEEPALLOC,
1271 & idIRN, idJCN, idA, idROWSCA, idCOLSCA, WORK2, KEEP,
1272 & ICNTL, INFO, INFOG )
1274 INTEGER, INTENT(IN) :: N
1275 INTEGER(8), INTENT(IN) :: NZ
1276 INTEGER, INTENT(OUT) :: PERM(:)
1277 INTEGER, POINTER, DIMENSION(:) :: idIRN, idJCN
1278 COMPLEX, POINTER, DIMENSION(:) :: idA
1279 REAL, POINTER, DIMENSION(:) :: idROWSCA, idCOLSCA
1280 INTEGER, TARGET :: IKEEPALLOC(3*N)
1281 INTEGER, INTENT(INOUT) :: MTRANS
1282 INTEGER :: KEEP(500)
1283 INTEGER, INTENT(IN) :: ICNTL(60)
1284 INTEGER, INTENT(INOUT) :: INFO(80)
1285 INTEGER, INTENT(INOUT) :: INFOG(80)
1286 INTEGER, TARGET :: WORK2(N)
1288 INTEGER, ALLOCATABLE, DIMENSION(:) :: IW
1289 REAL, ALLOCATABLE, DIMENSION(:) :: S2
1291 INTEGER ICNTL64(10), INFO64(10)
1292 INTEGER ICNTL_SYM_MWM(10),INFO_SYM_MWM(10)
1294 INTEGER MPRINT,LP, MP
1296 INTEGER NUMNZ, I, J, JPOS
1297 LOGICAL PROK, IDENT, DUPPLI
1298 INTEGER K50, KER_SIZE, NZER_DIAG, MTRANSLOC,RZ_DIAG
1300 INTEGER(8), DIMENSION(:), ALLOCATABLE :: IPE
1301 INTEGER(8), DIMENSION(:), ALLOCATABLE :: IPQ8
1303 INTEGER(8) :: NZTOT, NZREAL, IPIW, LIW, LIWMIN, NZsave,
1304 & K, KPOS, LDW, LDWMIN, IRNW, RSPOS, CSPOS,
1307 INTEGER,POINTER,DIMENSION(:) :: ZERODIAG
1308 INTEGER,POINTER,DIMENSION(:) :: STR_KER
1309 INTEGER,POINTER,DIMENSION(:) :: MARKED
1310 INTEGER,POINTER,DIMENSION(:) :: FLAG
1311 INTEGER,POINTER,DIMENSION(:) :: PIV_OUT
1312 REAL THEMIN, THEMAX, COLNORM,MAXDBL, ABSAK
1314 PARAMETER(ZERO = 0.0E0,TWO = 2.0E0,ONE = 1.0E0)
1319.GT..AND..GE.
PROK = ((MPRINT0)(ICNTL(4)2))
1321 SCALINGLOC = .FALSE.
1322.EQ.
IF(KEEP(52) -2) THEN
1323.not.
IF(associated(idA)) THEN
1327.EQ.
ELSE IF(KEEP(52) 77) THEN
1329.NE..AND..NE.
IF( MTRANS 5 MTRANS 6
1330.AND..NE.
& MTRANS 7) THEN
1331 SCALINGLOC = .FALSE.
1333.not.
IF(associated(idA)) THEN
1334 SCALINGLOC = .FALSE.
1336 & WRITE(MPRINT,*) 'analysis: auto scaling off because
',
1337 & 'a not provided at analysis
'
1340.EQ..AND..NE..AND.
IF ( (KEEP(50)2)(ICNTL(8)-2)
1341.EQ..OR..EQ.
& (MTRANS 7 KEEP(95) 0) ) THEN
1342 ZERODIAG => IKEEPALLOC(1:N)
1350.LE..AND..GE.
IF ( (JN)(J1) ) THEN
1351.EQ.
IF(ZERODIAG(I) 0) THEN
1353 IF(associated(idA)) THEN
1355.EQ.
IF(ABSAK real(0.0E0)) THEN
1356 RZ_DIAG = RZ_DIAG + 1
1359 NZER_DIAG = NZER_DIAG - 1
1363.LT.
IF( (NZER_DIAG+RZ_DIAG) (N/10) ) THEN
1370 IF (PROK) WRITE(MPRINT,*)
1371 & 'scaling will be computed during analysis
'
1373.NE..AND..NOT.
IF( MTRANS0 (associated(idA)) ) MTRANS=1
1375.LT..OR..GT.
IF (MTRANS0 MTRANS7) GO TO 500
1377.NOT..AND..EQ.
IF( SCALINGLOC MTRANS 7) THEN
1381.NE.
IF (MTRANSLOC6) THEN
1386.EQ.
IF (MTRANS 7) MTRANSLOC = 5
1388.AND..NE..AND.
IF(SCALINGLOC MTRANSLOC 5
1389.NE.
& MTRANSLOC 6 ) THEN
1390 IF (PROK) WRITE(MPRINT,*)
1391 & 'warning scaling required: set mtrans option to 5
'
1403 ZERODIAG => IKEEPALLOC(1:N)
1404 STR_KER => IKEEPALLOC(N+1:2*N)
1405 CALL CMUMPS_MTRANSI(ICNTL64,CNTL64)
1406 ICNTL64(1) = ICNTL(1)
1407 ICNTL64(2) = ICNTL(2)
1408 ICNTL64(3) = ICNTL(3)
1410.EQ.
IF (ICNTL(4)3) ICNTL64(4) = 0
1411.EQ.
IF (ICNTL(4)4) ICNTL64(4) = 1
1414 WRITE(MPRINT,'(a,i3)
')
1415 & 'compute maximum matching(maximum transversal):
',
1418 & WRITE(MPRINT,'(a,i3)
')' ... job =
',MTRANSLOC
1420 & WRITE(MPRINT,'(a,i3,a)
')
1421 & ' ... job =
',MTRANSLOC,': bottleneck thesis
'
1423 & WRITE(MPRINT,'(a,i3,a)
')
1424 & ' ... job =
',MTRANSLOC,': bottleneck simax
'
1426 & WRITE(MPRINT,'(a,i3,a)
')
1427 & ' ... job =
',MTRANSLOC,': maximize sum diagonal
'
1428.EQ..OR..EQ.
IF (MTRANSLOC5 MTRANSLOC6)
1429 & WRITE(MPRINT,'(a,i3,a)
')
1430 & ' ... job =
',MTRANSLOC,
1431 & ': maximize product diagonal and scale
'
1433 INFOG(23) = MTRANSLOC
1434 CNTL64(2) = huge(CNTL64(2))
1437.EQ.
IF (MTRANSLOC1) LIWMIN = 5_8*N8
1438.EQ.
IF (MTRANSLOC2) LIWMIN = 3_8*N8
1439.EQ.
IF (MTRANSLOC3) LIWMIN = 10_8*N8 + NZTOT
1440.EQ.
IF (MTRANSLOC4) LIWMIN = 2_8*N8
1441.EQ.
IF (MTRANSLOC5) LIWMIN = 5_8*N8
1442.EQ.
IF (MTRANSLOC6) LIWMIN = 5_8*N8 + NZTOT
1445 ALLOCATE(IW(LIWG), stat=allocok)
1446.GT.
IF (allocok 0 ) THEN
1449 ALLOCATE( IPQ8(N), IPE(N+1), stat = allocok )
1450.GT.
IF ( allocok 0 ) THEN
1452 INFO( 2 ) = (2*N+1)*KEEP(10)
1455.EQ.
IF (MTRANSLOC1) THEN
1458.EQ.
IF (MTRANSLOC2) LDWMIN = max( N8+NZTOT , N8+3_8 )
1459.EQ.
IF (MTRANSLOC3) LDWMIN = max( NZTOT+1_8 , N8+3_8 )
1460.EQ.
IF (MTRANSLOC4) LDWMIN = 2_8 * N8 +
1461 & max( NZTOT , N8+3_8 )
1462.EQ.
IF (MTRANSLOC5) LDWMIN = 3_8*N8 + NZTOT
1463.EQ.
IF (MTRANSLOC6) LDWMIN = 4_8*N8 + NZTOT
1465 ALLOCATE(S2(LDW), stat=allocok)
1466.GT.
IF (allocok 0 ) THEN
1469.NE.
IF(MTRANSLOC 1) LDW = LDW-NZTOT
1480.LE..AND..GE..AND.
IF ( (JN)(J1)
1481.LE..AND..GE.
& (IN)(I1) ) THEN
1482 IPQ8(J) = IPQ8(J) + 1_8
1483 NZREAL = NZREAL + 1_8
1493.LE..AND..GE..AND.
IF ( (JN)(J1)
1494.LE..AND..GE.
& (IN)(I1) ) THEN
1495 IPQ8(J) = IPQ8(J) + 1_8
1496 NZREAL = NZREAL + 1_8
1498 IPQ8(I) = IPQ8(I) + 1_8
1499 NZREAL = NZREAL + 1_8
1501.EQ.
IF (ZERODIAG(I) 0) THEN
1503 IF(associated(idA)) THEN
1505.EQ.
IF(ABSAK real(0.0E0)) THEN
1506 RZ_DIAG = RZ_DIAG + 1
1508 ZERODIAG(I) = exponent(ABSAK)
1509.EQ.
if ( ZERODIAG(I)0) ZERODIAG(I)=1
1511 NZER_DIAG = NZER_DIAG - 1
1513 IF(associated(idA)) THEN
1515 ZERODIAG(I) = ZERODIAG(I)+ exponent(ABSAK)
1516.EQ.
if ( ZERODIAG(I)0) ZERODIAG(I)=1
1522.GE.
IF(MTRANSLOC 4) THEN
1524.EQ.
IF(ZERODIAG(I) 0) THEN
1525 IPQ8(I) = IPQ8(I) + 1_8
1526 NZREAL = NZREAL + 1_8
1533 IPE(J+1) = IPE(J)+IPQ8(J)
1539.EQ.
IF (MTRANSLOC1) THEN
1543.LE..AND..GE..AND.
IF ( (JN)(J1)
1544.LE..AND..GE.
& (IN)(I1)) THEN
1546 IW(IRNW+KPOS-1_8) = I
1547 IPQ8(J) = IPQ8(J) + 1_8
1551.not.
IF ( associated(idA)) THEN
1559.LE..AND..GE..AND.
IF ( (JN)(J1)
1560.LE..AND..GE.
& (IN)(I1)) THEN
1563 S2(KPOS) = abs(idA(K))
1564 IPQ8(J) = IPQ8(J) + 1_8
1569.EQ.
IF (MTRANSLOC1) THEN
1573.LE..AND..GE..AND.
IF ( (JN)(J1)
1574.LE..AND..GE.
& (IN)(I1)) THEN
1577 IPQ8(J) = IPQ8(J) + 1_8
1581 IPQ8(I) = IPQ8(I) + 1_8
1586.not.
IF ( associated(idA) ) THEN
1592 THEMIN = huge(THEMIN)
1596.LE..AND..GE..AND.
IF ( (JN)(J1)
1597.LE..AND..GE.
& (IN)(I1)) THEN
1599 IW(IRNW+KPOS-1_8) = I
1600 S2(KPOS) = abs(idA(K))
1601 IPQ8(J) = IPQ8(J) + 1_8
1602.GT.
IF(abs(idA(K)) THEMAX) THEN
1603 THEMAX = abs(idA(K))
1604.LT.
ELSE IF(abs(idA(K)) THEMIN
1605.AND..GT.
& abs(idA(K)) ZERO) THEN
1606 THEMIN = abs(idA(K))
1611 S2(KPOS) = abs(idA(K))
1612 IPQ8(I) = IPQ8(I) + 1_8
1617.EQ.
IF(ZERODIAG(I) 0) THEN
1621 IPQ8(I) = IPQ8(I) + 1_8
1624.NE.
IF ( THEMAX ZERO ) THEN
1625 CNTL64(2) = (log(THEMAX/THEMIN))*(real(N))
1626 & - log(THEMIN) + ONE
1632 FLAG => IKEEPALLOC(2*N+1:3*N)
1633.NE.
IF(MTRANSLOC1) THEN
1634 CALL CMUMPS_SUPPRESS_DUPPLI_VAL(N,NZREAL,IPE(1),IW(IRNW),S2,
1637 CALL CMUMPS_SUPPRESS_DUPPLI_STR(N,NZREAL,IPE(1),IW(IRNW),
1640.NE.
IF(NZREAL NZsave) DUPPLI = .TRUE.
1642.EQ.
IF ( MTRANSLOC 1 ) THEN
1646 CALL CMUMPS_MTRANS_DRIVER(MTRANSLOC ,N, N, NZREAL,
1647 & IPE, IW(IRNW), S2(1), LS2,
1648 & NUMNZ, PERM(1), LIW, IW(IPIW), LDW, S2(LS2+1),
1650 & ICNTL64, CNTL64, INFO64, INFO)
1651.LT.
IF (INFO(1)0) THEN
1652.GT..AND..GE.
IF (LP0 ICNTL(4)1)
1653 & WRITE(LP,'(a,i5)
')
1654 & ' not enough memory in maxtrans info(1)=
',INFO(1)
1657.LT.
IF (INFO64(1)0) THEN
1658.GT..AND..GE.
IF (LP0 ICNTL(4)1)
1659 & WRITE(LP,'(a,i5)
')
1660 & ' internal error in maxtrans info(1)=
',INFO64(1)
1665.GT.
IF (INFO64(1)0) THEN
1666.GT..AND..GE.
IF (MP0 ICNTL(4)2)
1667 & WRITE(MP,'(a,i5)
')
1668 & ' warning in maxtrans info(1)=
',INFO64(1)
1673.EQ.
IF(ZERODIAG(I) 0) THEN
1674.EQ.
IF(PERM(I) I) THEN
1675 KER_SIZE = KER_SIZE + 1
1677 STR_KER(KER_SIZE) = I
1682.LT.
IF (NUMNZN) GO TO 400
1685.EQ.
IF (MTRANS 0 ) GOTO 102
1688 IW(IRNW+int(JPERM-1,8)) = J
1689.NE.
IF (JPERMJ) IDENT = .FALSE.
1694.EQ.
IF(MTRANS 7) THEN
1698 IF (PROK) WRITE(MPRINT,'(a)
')
1699 & ' ... apply column permutation
'
1702.LE..OR..GT.
IF ((J0)(JN)) GO TO 100
1703 idJCN(K) = IW(IRNW+int(J-1,8))
1705.GT..AND..GE.
IF (MP0 ICNTL(4)2)
1707 & ' warning input matrix
data modified
'
1710 IF (SCALINGLOC) THEN
1711 IF ( associated(idCOLSCA))
1712 & DEALLOCATE( idCOLSCA )
1713 IF ( associated(idROWSCA))
1714 & DEALLOCATE( idROWSCA )
1715 ALLOCATE( idCOLSCA(N), stat=allocok)
1716.GT.
IF (allocok 0) THEN
1719.GE..AND..GE.
IF ((LP0)(ICNTL(4)1)) THEN
1722 & '** failure during allocation of colsca
'
1726 ALLOCATE( idROWSCA(N), stat=allocok)
1727.GT.
IF (allocok 0) THEN
1730.GE..AND..GE.
IF ((LP0)(ICNTL(4)1)) THEN
1733 & '** failure during allocation of rowsca
'
1739 MAXDBL = log(huge(MAXDBL))
1741.GT.
IF(S2(RSPOS+J) MAXDBL) THEN
1744.GT.
IF(S2(CSPOS+J) MAXDBL) THEN
1750 idROWSCA(J) = exp(S2(RSPOS+J8))
1751.EQ.
IF(idROWSCA(J) ZERO) THEN
1754.EQ..OR..EQ.
IF ( MTRANS -9876543 MTRANS 0 ) THEN
1755 idCOLSCA(J)= exp(S2(CSPOS+J8))
1756.EQ.
IF(idCOLSCA(J) ZERO) THEN
1760 idCOLSCA(IW(IRNW+J8-1_8))= exp(S2(CSPOS+J8))
1761.EQ.
IF(idCOLSCA(IW(IRNW+J8-1_8)) ZERO) THEN
1762 idCOLSCA(IW(IRNW+J8-1_8)) = ONE
1770 IF ( associated(idCOLSCA)) DEALLOCATE( idCOLSCA )
1771 IF ( associated(idROWSCA)) DEALLOCATE( idROWSCA )
1772 ALLOCATE( idCOLSCA(N), stat=allocok)
1773.GT.
IF (allocok 0) THEN
1776.GE..AND..GE.
IF ((LP0)(ICNTL(4)1)) THEN
1779 & '** failure during allocation of colsca
'
1783 ALLOCATE( idROWSCA(N), stat=allocok)
1784.GT.
IF (allocok 0) THEN
1787.GE..AND..GE.
IF ((LP0)(ICNTL(4)1)) THEN
1790 & '** failure during allocation of rowsca
'
1796 MAXDBL = log(huge(MAXDBL))
1799.GT.
IF(S2(RSPOS+J8)+S2(CSPOS+J8) MAXDBL) THEN
1806.GT.
IF(PERM(J) 0) THEN
1808 & exp((S2(RSPOS+J8)+S2(CSPOS+J8))/TWO)
1809.EQ.
IF(idROWSCA(J) ZERO) THEN
1812 idCOLSCA(J)= idROWSCA(J)
1818 DO K = IPE(I),IPE(I+1) - 1
1819 IF ( PERM( IW( IRNW+K-1_8) ) > 0 ) THEN
1820 COLNORM = max(COLNORM,S2(J))
1823 COLNORM = exp(COLNORM)
1824 idROWSCA(I) = ONE / COLNORM
1825 idCOLSCA(I) = idROWSCA(I)
1828.EQ..OR..EQ.
IF(MTRANS 7 KEEP(95) 0) THEN
1829.LT.
IF( (NZER_DIAG+RZ_DIAG) (N/10)
1830.AND..EQ.
& KEEP(95) 0) THEN
1835.EQ.
IF(KEEP(95) 0) THEN
1842.EQ.
IF(MTRANS 7) MTRANS = 5
1845.EQ.
IF(MTRANS 0) GOTO 390
1848.EQ..OR..EQ..OR.
IF(MTRANS 5 MTRANS 6
1849.EQ.
& MTRANS 7) THEN
1850 ICNTL_SYM_MWM(1) = 0
1851 ICNTL_SYM_MWM(2) = 1
1852.EQ.
ELSE IF(MTRANS 4) THEN
1853 ICNTL_SYM_MWM(1) = 2
1854 ICNTL_SYM_MWM(2) = 1
1856 ICNTL_SYM_MWM(1) = 0
1857 ICNTL_SYM_MWM(2) = 1
1859 MARKED => IKEEPALLOC(N+1:2*N)
1860 FLAG => IKEEPALLOC(2*N+1:3*N)
1861 PIV_OUT => WORK2(1:N)
1862.LT.
IF(MTRANSLOC 4) THEN
1867 CALL CMUMPS_SYM_MWM(
1868 & N, NZREAL, IPE, IW(IRNW), S2(1),LSC, PERM(1),
1870 & ICNTL_SYM_MWM, S2(LSC+1),MARKED(1),FLAG(1),
1871 & PIV_OUT(1), INFO_SYM_MWM)
1872.NE.
IF(INFO_SYM_MWM(1) 0) THEN
1876.EQ.
IF(INFO_SYM_MWM(3) N) THEN
1878.EQ..AND.
ELSEIF ( (ICNTL(12)0)
1879.GT.
& ( (N-INFO_SYM_MWM(4)-INFO_SYM_MWM(3)) N/10 )
1885 PERM(I) = PIV_OUT(I)
1888 KEEP(93) = INFO_SYM_MWM(4)
1889 KEEP(94) = INFO_SYM_MWM(3)
1892.EQ.
390 IF(MTRANS 0) THEN
1895 WRITE (MPRINT,'(a)
')
1896 & ' ... column permutation not used
'
1900.GE..AND..GE.
400 IF ((LP0)(ICNTL(4)1))
1901 & WRITE (LP,'(/a)
') '** error: matrix is structurally singular
'
1905.GE..AND..GE.
410 IF ((LP0)(ICNTL(4)1)) THEN
1907 WRITE (LP,'(a,i14)
')
1908 & '** failure during allocation of
INTEGER array of size
',
1912 CALL MUMPS_SET_IERROR(LIWG,INFO(2))
1914.GE..AND..GE.
430 IF ((LP0)(ICNTL(4)1)) THEN
1915 WRITE (LP,'(
') '** Error in CMUMPS_ANA_O
'
1916 WRITE (LP,'(A)
') '** Failure during allocation S2
'
1919 CALL MUMPS_SET_IERROR(LDW,INFO(2))
1921 IF (allocated(IW)) DEALLOCATE(IW)
1922 IF (allocated(S2)) DEALLOCATE(S2)
1923 IF (allocated(IPE)) DEALLOCATE(IPE)
1924 IF (allocated(IPQ8)) DEALLOCATE(IPQ8)
1926 END SUBROUTINE CMUMPS_ANA_O
1927 END MODULE CMUMPS_ANA_AUX_M
1928 SUBROUTINE CMUMPS_ANA_K(N,IPE, IW, LW, IWFR, IPS, IPV,
1930 & NCMPA, SIZE_SCHUR, PARENT)
1932 INTEGER, INTENT(IN) :: N, SIZE_SCHUR
1933 INTEGER, INTENT(IN) :: IPS(N)
1934 INTEGER(8), INTENT(IN) :: LW
1935 INTEGER, INTENT(OUT) :: NCMPA
1936 INTEGER, INTENT(OUT) :: IPV(N), NV(N), PARENT(N)
1937 INTEGER(8), INTENT(INOUT) :: IWFR
1938 INTEGER(8), INTENT(INOUT) :: IPE(N)
1939 INTEGER, INTENT(INOUT) :: IW(LW)
1940 INTEGER, INTENT(OUT) :: FLAG(N)
1941 INTEGER I,J,ML,MS,ME,MINJS,IE,KDUMMY
1943 INTEGER(8) :: JP, JP1, JP2, LWFR, IP
1951 DO 100 ML=1,N-SIZE_SCHUR
1961.LE.
IF (JP0_8) GO TO 60
1963 DO 50 JP1=1_8,int(LN,8)
1966.EQ.
IF (FLAG(JS)ME) GO TO 50
1968.LT.
IF (IWFRLW) GO TO 40
1970 IW(JP) = LN - int(JP1)
1971 CALL CMUMPS_ANA_D(N, IPE, IW, IP-1_8, LWFR, NCMPA)
1974.GT.
IF (IPJP2) GO TO 30
1982 MINJS = min0(MINJS,IPS(JS)+0)
1985 60 IPE(IE) = int(-ME,8)
1989.EQ.
IF (IE0) GO TO 80
1991.GT.
80 IF (IWFRIP) GO TO 90
1995 90 MINJS = IPV(MINJS)
1999 IW(IP) = int(IWFR - IP)
2003 IF (SIZE_SCHUR == 0) GOTO 500
2004 DO ML = N-SIZE_SCHUR+1,N
2010.LE.
IF (JP0_8) GO TO 160
2012 160 IPE(IE) = int(-IPV(N-SIZE_SCHUR+1),8)
2016.EQ.
IF (IE0) GO TO 190
2019 IPE(ME) = int(-IPV(N-SIZE_SCHUR+1),8)
2021 ME = IPV(N-SIZE_SCHUR+1)
2025 PARENT(I) = int(IPE(I))
2028 END SUBROUTINE CMUMPS_ANA_K
2029 SUBROUTINE CMUMPS_ANA_J(N, NZ, IRN, ICN, PERM,
2030 & IW, LW, IPE, IQ, FLAG,
2031 & IWFR, IFLAG, IERROR, MP)
2032 INTEGER, INTENT(IN) :: N
2033 INTEGER(8), INTENT(IN) :: NZ, LW
2034 INTEGER, INTENT(IN) :: IRN(NZ), ICN(NZ)
2035 INTEGER, INTENT(IN) :: PERM(N)
2036 INTEGER, INTENT(IN) :: MP
2037 INTEGER(8), INTENT(OUT):: IWFR
2038 INTEGER, INTENT(OUT) :: IERROR
2039 INTEGER, INTENT(OUT) :: IQ(N)
2040 INTEGER(8), INTENT(OUT) :: IPE(N)
2041 INTEGER, INTENT(OUT) :: IW(LW)
2042 INTEGER, INTENT(OUT) :: FLAG(N)
2043 INTEGER, INTENT(INOUT) :: IFLAG
2044 INTEGER :: I,J,LBIG,IN,LEN,JDUMMY,L1
2045 INTEGER(8) :: K, K1, K2, KL, KID
2056.GE..AND..LE.
IF (I1 JN) GO TO 60
2058.GE..AND..LE.
30 IF (J1 IN) GO TO 60
2061.GE..AND..LE.
IF (I1 IN) GO TO 80
2062 50 IERROR = IERROR + 1
2064.LE..AND..GT.
IF (IERROR1 MP0) WRITE (MP,99999)
2065.LE..AND..GT.
IF (IERROR10 MP0) WRITE (MP,99998) K, I, J
2067.GT.
60 IF (PERM(J)PERM(I)) GO TO 70
2070 70 IQ(I) = IQ(I) + 1
2072.GE.
IF (IERROR1) THEN
2073.EQ.
IF (mod(IFLAG,2) 0) IFLAG = IFLAG+1
2079 LBIG = max0(L1,LBIG)
2080 IWFR = IWFR + int(L1,8)
2085.LE.
IF (I0) GO TO 140
2090.LT.
IF (PERM(I)PERM(J)) GO TO 110
2101.LE.
IF (I0) GO TO 140
2111.LE.
IF (LEN0) GO TO 160
2120.GE.
IF (LBIGhuge(N)) GO TO 190
2124.EQ.
IF (IQ(I)0) IPE(I) = 0_8
2130 K2 = IPE(I) + int(IQ(I),8)
2131.LE.
IF (K1K2) GO TO 200
2138.EQ.
IF (FLAG(J)I) GO TO 210
2144 IW(K) = int(IWFR - K - 1_8)
214799999 FORMAT (' *** WARNING MESSAGE FROM CMUMPS_ANA_J ***
' )
214899998 FORMAT (I6, ' (IN ROW, I6, 11H AND COLUMN
', I6,
2150 END SUBROUTINE CMUMPS_ANA_J
2151 SUBROUTINE CMUMPS_ANA_D(N, IPE, IW, LW, IWFR,NCMPA)
2152 INTEGER, INTENT(IN) :: N
2153 INTEGER(8), INTENT(IN) :: LW
2154 INTEGER(8), INTENT(OUT) :: IWFR
2155 INTEGER(8), INTENT(INOUT):: IPE(N)
2156 INTEGER, INTENT(INOUT) :: NCMPA
2157 INTEGER, INTENT(INOUT) :: IW(LW)
2159 INTEGER(8) :: K1, K, K2, LWFR
2163.LE.
IF (K10_8) GO TO 10
2164 IPE(I) = int(IW(K1), 8)
2170.GT.
IF (LWFRLW) GO TO 70
2172.LT.
IF (IW(K)0) GO TO 30
2176 IW(IWFR) = int(IPE(I))
2177 IPE(I) = int(IWFR,8)
2179 K2 = K + int(IW(IWFR),8)
2181.GT.
IF (K1K2) GO TO 50
2189 END SUBROUTINE CMUMPS_ANA_D
2191 SUBROUTINE CMUMPS_ANA_L(N, IPE, NV, IPS, NE, NA, NFSIZ,
2193 & FILS, FRERE,NDD,NEMIN, KEEP60)
2196 INTEGER FILS(N), FRERE(N)
2197 INTEGER IPS(N), NE(N), NA(N), NFSIZ(N)
2198 INTEGER IPE(N), NV(N)
2199 INTEGER NEMIN, KEEP60
2200 INTEGER I,IF,IS,NR,NR1,INS,INL,INB,INF,INFS,INSW
2201 INTEGER K,L,ISON,IN,INP,IFSON,INC,INO
2208.GT.
IF (NV(I)0) GO TO 20
2211.GT.
IF (IS0) IPE(I) = IS
2216.LE.
IF (NV(I)0) GO TO 50
2220.GT.
IF (IS0) IPE(I) = IS
2232.GT.
1000 IF (NR1N) GO TO 1151
2235 1070 INL = FILS(INS)
2240.LT.
1080 IF (IPE(INS)0) THEN
2245.EQ.
IF (IPE(INS)0) THEN
2250.EQ.
IF (NV(INB)0) THEN
2254.GE.
IF (NV(INB)NV(INS)) THEN
2260.GT.
IF (INF0) GO TO 1090
2263.EQ.
IF (INFSINS) THEN
2272 1100 INFS = IPE(INSW)
2273.NE.
IF (INFSINS) THEN
2291.GT.
IF (I0) GO TO 60
2298.GE.
IF (IPS(I)0) GO TO 80
2307.GT.
IF (NV(I)0) GO TO 89
2310.GT.
IF (IN0) GO TO 81
2315.GT.
IF (IN0) GO TO 82
2321.GT.
IF (IN0) GO TO 83
2322.EQ.
IF (IFSON I) GO TO 86
2327.NE.
IF (INI) GO TO 84
2328 FRERE(INC) = FRERE(I)
2330.LT.
86 IF (FRERE(I)0) FILS(INP) = 0
2331.GT.
IF (FRERE(I)0) FILS(INP) = -FRERE(I)
2333.LT.
89 IF (ILN) NA(IL+1) = NA(IL+1) + 1
2337.LT.
IF (NA(IS)1) GO TO 110
2338.NE..AND.
IF ( (KEEP600)
2339.EQ.
& (NE(IS)NDD(IS)) ) GOTO 110
2340.EQ.
IF (NDD(IS-1)-NE(IS-1)NDD(IS)) GO TO 100
2341.GE..AND.
IF ((NE(IS-1)NEMIN)
2342.GE.
& (NE(IS)NEMIN) ) GO TO 110
2343.GE.
IF (2*NE(IS-1)*(NDD(IS)-NDD(IS-1)+NE(IS-1))
2344 & ((NDD(IS)+NE(IS-1))*
2345 & (NDD(IS)+NE(IS-1))*NEMIN/100)) GO TO 110
2346 100 NA(IS-1) = NA(IS-1) + NA(IS) - 1
2347 NDD(IS-1) = NDD(IS) + NE(IS-1)
2348 NE(IS-1) = NE(IS) + NE(IS-1)
2353.GT.
IF (IN0) GO TO 101
2358.GT.
IF (IN0) GO TO 102
2360 NFSIZ(I) = NDD(IS-1)
2364.GT.
IF (IN0) GO TO 103
2366.EQ.
IF (IFSONINO) GO TO 107
2371.NE.
IF (ININO) GO TO 105
2372.EQ.
IF (INOS0) FRERE(INS) = -I
2373.NE.
IF (INOS0) FRERE(INS) = INOS
2374.EQ.
IF (INOS0) GO TO 109
2376.EQ.
IF (IN0) GO TO 109
2379.GT.
IF (IN0) GO TO 108
2385.LT.
IF (IB0) GOTO 150
2386.EQ.
IF (IB0) GOTO 140
2402 END SUBROUTINE CMUMPS_ANA_L
2404 SUBROUTINE CMUMPS_ANA_LNEW(N, IPE, NV, IPS, NE, NA, NFSIZ,
2406 & FILS, FRERE, ND, NEMIN, SUBORD, KEEP60,
2407 & KEEP20, KEEP38, NAMALG,NAMALGMAX,
2408 & CUMUL,KEEP50, ICNTL13, KEEP37, KEEP197, NSLAVES,
2409 & ALLOW_AMALG_TINY_NODES
2410 & , BLKON, SIZEOFBLOCKS, LSIZEOFBLOCKS
2413 INTEGER N, NSTEPS, KEEP60, KEEP20, KEEP38, KEEP50
2414 INTEGER ND(N), NFSIZ(N)
2415 INTEGER IPE(N), FILS(N), FRERE(N), SUBORD(N)
2416 INTEGER NV(N), IPS(N), NE(N), NA(N), NODE(N)
2417 INTEGER NEMIN,AMALG_COUNT
2418 INTEGER NAMALG(N),NAMALGMAX, CUMUL(N)
2419 DOUBLE PRECISION SIZE_DADI_AMALGAMATED, PERCENT_FILL
2420 DOUBLE PRECISION ACCU, FLOPS_FATHER, FLOPS_SON,
2421 & FLOPS_AVANT, FLOPS_APRES
2422 INTEGER ICNTL13, KEEP37, NSLAVES
2423 LOGICAL ALLOW_AMALG_TINY_NODES
2425 LOGICAL, INTENT(IN) :: BLKON
2426 INTEGER, INTENT(IN) :: LSIZEOFBLOCKS
2427 INTEGER, INTENT(IN) :: SIZEOFBLOCKS(LSIZEOFBLOCKS)
2428#if defined(NOAMALGTOFATHER)
2431 INTEGER I,IF,IS,NR,INS
2432 INTEGER K,L,ISON,IN,IFSON,INO
2436#if defined(NOAMALGTOFATHER)
2437 INTEGER INB,INF,INFS,INL,INSW,INT1,NR1
2441 LOGICAL AMALG_TO_father_OK
2452 NODE(I) = SIZEOFBLOCKS(I)
2457 FRERE(1:N) = IPE(1:N)
2462.EQ.
IF (NV(I)0) THEN
2463.NE.
IF (SUBORD(IF)0) SUBORD(I) = SUBORD(IF)
2466 NODE(IF) = NODE(IF)+SIZEOFBLOCKS(I)
2468 NODE(IF) = NODE(IF)+1
2470 MAXNODE = max(NODE(IF),MAXNODE)
2474.GT.
IF (IS0) FRERE(I) = IS
2482 MAXNODE = int(dble(MAXNODE)*dble(NEMIN) / dble(100))
2483 MAXNODE = max(MAXNODE,2000)
2484#if defined(NOAMALGTOFATHER)
2490.GT.
1000 IF (NR1N) GO TO 1151
2493 1070 INL = FILS(INS)
2498.LT.
1080 IF (FRERE(INS)0) THEN
2503.EQ.
IF (FRERE(INS)0) THEN
2508.GE.
IF (NV(INB)NV(INS)) THEN
2513 1090 INF = FRERE(INF)
2514.GT.
IF (INF0) GO TO 1090
2517.EQ.
IF (INFSINS) THEN
2520 FRERE(INS) = FRERE(INB)
2524 1100 INFS = FRERE(INSW)
2525.NE.
IF (INFSINS) THEN
2529 FRERE(INS) = FRERE(INB)
2544 AMALG_TO_father_OK=.FALSE.
2554.GE.
IF (IPS(I)0) EXIT
2561#if ! defined(NOAMALGTOFATHER)
2563.NE..AND.
IF ( (DADI0)
2566.NE..AND..NE.
& ( (KEEP20DADI)(KEEP38DADI) )
2569 ACCU = dble(2)*dble(NODE(I))*dble(NV(DADI)-NV(I)+NODE(I))
2570 SIZE_DADI_AMALGAMATED =
2571 & dble(NV(DADI)+NODE(I)) *
2572 & dble(NV(DADI)+NODE(I))
2573 PERCENT_FILL = dble(100) * ACCU / SIZE_DADI_AMALGAMATED
2574 ACCU = ACCU + dble(CUMUL(I))
2575 AMALG_TO_father_OK = (
2576.LE..AND..LE.
& ( (NODE(I)MAXNODE)(NODE(DADI)MAXNODE) )
2578.LE..and..GT.
& ( (NODE(I)NEMIN NODE(DADI) MAXNODE)
2579.OR..LE..and..GT.
& (NODE(DADI)NEMIN NODE(I)MAXNODE)))
2580.AND.
AMALG_TO_father_OK = ( AMALG_TO_father_OK
2581 & ( PERCENT_FILL < dble(NEMIN) ) )
2582.EQ.
IF (KEEP197 1 ) THEN
2583.OR.
AMALG_TO_father_OK = AMALG_TO_father_OK
2584.LE..AND..LT.
& ( NODE(I)2*NEMIN NODE(DADI)4*NEMIN)
2586.AND.
AMALG_TO_father_OK = ( AMALG_TO_father_OK
2587.LE.
& ( ACCU / SIZE_DADI_AMALGAMATED dble(NEMIN)) )
2588 IF (AMALG_TO_father_OK) THEN
2589 CALL MUMPS_GET_FLOPS_COST(NV(I),NODE(I),NODE(I),
2590 & KEEP50,1,FLOPS_SON)
2591 CALL MUMPS_GET_FLOPS_COST(NV(DADI),NODE(DADI),
2593 & KEEP50,1,FLOPS_FATHER)
2594 FLOPS_AVANT = FLOPS_FATHER+FLOPS_SON
2595 & + max(dble(200.0) * dble(NV(I)-NODE(I))
2596 & * dble(NV(I)-NODE(I)),
2598 CALL MUMPS_GET_FLOPS_COST(NV(DADI)+NODE(I),
2599 & NODE(DADI)+NODE(I),
2600 & NODE(DADI)+NODE(I),
2601 & KEEP50,1,FLOPS_APRES)
2602.GT.
IF (FLOPS_APRESFLOPS_AVANT*
2603 & (dble(1)+dble(max(8,NEMIN)-8)/dble(100))) THEN
2604 AMALG_TO_father_OK = .FALSE.
2607.GT..AND..GT.
IF ( (NV(I) 50*NV(DADI)) (NSLAVES1)
2608.AND..LE.
& (ICNTL130)
2609.AND..GT.
& (NV(I) KEEP37) ) THEN
2610.LT.
IF ( ( ACCU / SIZE_DADI_AMALGAMATED ) 0.2 ) THEN
2611 AMALG_TO_father_OK = .TRUE.
2614.AND.
IF ( ALLOW_AMALG_TINY_NODES
2615.LE.
& NODE(I) * 900 NV(DADI) - NAMALG(DADI)) THEN
2616 IF ( NAMALG(DADI) < (NV(DADI)-NAMALG(DADI))/50 ) THEN
2617 AMALG_TO_father_OK = .TRUE.
2618 NAMALG(DADI) = NAMALG(DADI) + NODE(I)
2621.EQ.
IF ( DADI -FRERE(I)
2622.AND..EQ.
& -FILS(DADI)I
2624.OR.
AMALG_TO_father_OK = ( AMALG_TO_father_OK
2625.EQ.
& ( NV(I)-NODE(I)NV(DADI)) )
2627 IF (AMALG_TO_father_OK) THEN
2628 CUMUL(DADI)=CUMUL(DADI)+nint(ACCU)
2629 NAMALG(DADI) = NAMALG(DADI) + NAMALG(I)
2630 AMALG_COUNT = AMALG_COUNT+1
2632.EQ.
75 IF (SUBORD(IN)0) GOTO 76
2639.EQ.
IF (IFSONI) THEN
2640.LT.
IF (FILS(I)0) THEN
2641 FILS(DADI) = FILS(I)
2644.GT.
IF (FRERE(I)0) THEN
2645 FILS(DADI) = -FRERE(I)
2655.NE.
IF (INI) GOTO 77
2656.LT.
IF (FILS(I) 0) THEN
2657 FRERE(INS) = -FILS(I)
2659 FRERE(INS) = FRERE(I)
2666.GT.
IF (IN0) GOTO 79
2667 FRERE(INO) = FRERE(I)
2669 NODE(DADI) = NODE(DADI)+ NODE(I)
2670 NV(DADI) = NV(DADI) + NODE(I)
2671 NA(IL+1) = NA(IL+1) + NA(IL)
2676 NE(IS) = NE(IS) + NODE(I)
2677.LT.
IF (ILN) NA(IL+1) = NA(IL+1) + 1
2684.EQ.
777 IF (SUBORD(IN)0) GO TO 778
2690.LE.
778 IF (NA(IS)0) GO TO 110
2691#if defined(NOAMALGTOFATHER)
2692.NE..AND.
IF ( (KEEP600)
2693.EQ.
& (NE(IS)ND(IS)) ) GOTO 110
2694.EQ.
IF (ND(IS-1)-NE(IS-1)ND(IS)) THEN
2697.GE.
IF(NAMALG(IS-1) NAMALGMAX) THEN
2700.GE..AND.
IF ((NE(IS-1)NEMIN)
2701.GE.
& (NE(IS)NEMIN) ) GO TO 110
2702.GE.
IF (2*NE(IS-1)*(ND(IS)-ND(IS-1)+NE(IS-1))
2703 & ((ND(IS)+NE(IS-1))*
2704 & (ND(IS)+NE(IS-1))*NEMIN/100)) GO TO 110
2705 NAMALG(IS-1) = NAMALG(IS-1)+1
2706 100 NA(IS-1) = NA(IS-1) + NA(IS) - 1
2707 ND(IS-1) = ND(IS) + NE(IS-1)
2708 NE(IS-1) = NE(IS) + NE(IS-1)
2715.GT.
IF (IN0) GO TO 102
2718.EQ.
888 IF (SUBORD(IN)0) GO TO 889
2721 889 SUBORD(IN) = INO
2723.EQ.
IF (IFSONINO) THEN
2730.NE.
IF (ININO) GO TO 105
2738.EQ.
IF (IN0) GO TO 120
2741.GT.
IF (IN0) GO TO 108
2748.GT.
IF (IB0) NA(IL) = 0
2757.EQ.
IF (NV(I)0) THEN
2761 NFSIZ(I) = ND(NODE(I))
2762.NE.
IF (SUBORD(I) 0) THEN
2765.NE.
DO WHILE (SUBORD(INO)0)
2775 END SUBROUTINE CMUMPS_ANA_LNEW
2777 SUBROUTINE CMUMPS_ANA_M(NE, ND, NSTEPS,
2778 & MAXFR, MAXELIM, K50, SIZEFAC_TOT, MAXNPIV,
2779 & K5,K6,PANEL_SIZE,K253)
2781 INTEGER, INTENT(in) :: NSTEPS, K50, K253, K5, K6
2782 INTEGER, INTENT(in) :: NE(NSTEPS), ND(NSTEPS)
2783 INTEGER, INTENT(out) :: MAXNPIV, PANEL_SIZE
2784 INTEGER, INTENT(out) :: MAXFR, MAXELIM
2785 INTEGER(8), INTENT(out):: SIZEFAC_TOT
2786 INTEGER ITREE, NFR, NELIM
2788 INTEGER(8) :: SIZEFAC
2797 NFR = ND(ITREE) + K253
2798.GT.
IF (NFRMAXFR) MAXFR = NFR
2799.GT.
IF (NFR-NELIMMAXELIM) MAXELIM = NFR - NELIM
2800.GT.
IF (NELIM MAXNPIV) THEN
2804 SIZEFAC = (2_8*int(NFR,8) - int(NELIM,8))*int(NELIM,8)
2805 PANEL_SIZE = max(PANEL_SIZE, NFR*(LKJIB+1))
2807 SIZEFAC = int(NFR,8) * int(NELIM,8)
2808 PANEL_SIZE = max(PANEL_SIZE, NELIM*(LKJIB+1))
2809 PANEL_SIZE = max(PANEL_SIZE, (NFR-NELIM)*(LKJIB+1))
2811 SIZEFAC_TOT = SIZEFAC_TOT + SIZEFAC
2814 END SUBROUTINE CMUMPS_ANA_M
2815 SUBROUTINE CMUMPS_ANA_R( N, FILS, FRERE,
2818 INTEGER, INTENT(IN) :: N
2819 INTEGER, INTENT(IN) :: FILS(N), FRERE(N)
2820 INTEGER, INTENT(OUT) :: NSTK(N), NA(N)
2821 INTEGER NBROOT, NBLEAF, ILEAF, I, IN, ISON
2827.EQ.
IF (FRERE(I) N+1) CYCLE
2828.EQ.
IF (FRERE(I)0) NBROOT = NBROOT + 1
2831.GT.
IF (IN0) GO TO 12
2838 13 NSTK(I) = NSTK(I) + 1
2840.GT.
IF (ISON0) GO TO 13
2844.GT.
IF (NBLEAFN-2) THEN
2845.EQ.
IF (NBLEAFN-1) THEN
2846 NA(N-1) = -NA(N-1)-1
2857 END SUBROUTINE CMUMPS_ANA_R
2858 SUBROUTINE CMUMPS_DIAG_ANA
2859 &( MYID, COMM, KEEP,KEEP8, INFO, INFOG, RINFO, RINFOG, ICNTL,
2862 INTEGER, INTENT(IN) :: COMM, MYID, KEEP(500), INFO(80),
2863 & ICNTL(60), INFOG(80), SIZE_SCHUR
2864 INTEGER(8), INTENT(IN) :: KEEP8(150)
2865 REAL, INTENT(IN) :: RINFO(40), RINFOG(40)
2869 PARAMETER( MASTER = 0 )
2871.eq..and..GT..AND..GE.
IF ( MYIDMASTERMPG0ICNTL(4)2) THEN
2873.EQ.
IF (ICNTL(15)0) ITMP = 0
2874 WRITE(MPG, 99992) INFO(1), INFO(2),
2875 & KEEP8(109), KEEP8(111), INFOG(4),
2876 & INFOG(5), KEEP(28), INFOG(32), INFOG(7), KEEP(23),
2877 & ICNTL(7), KEEP(12),
2881 & KEEP(56), KEEP(61), RINFOG(1)
2883 & WRITE(MPG, 99993) KEEP(95)
2884.GT.
IF (KEEP(54)0) WRITE(MPG, 99994) KEEP(54)
2885.GT.
IF (KEEP(60)0) WRITE(MPG, 99995) KEEP(60), SIZE_SCHUR
2886.GT.
IF (KEEP(253)0) WRITE(MPG, 99996) KEEP(253)
288999992 FORMAT(/'Leaving analysis phase with ...
'/
2890 & ' INFOG(1) =
',I16/
2891 & ' infog(2) =
',I16/
2892 & ' -- (20) number of entries in factors(estim.) =
',I16/
2893 & ' -- (3) real space
for factors(estimated) =
',I16/
2894 & ' -- (4)
Integer space for factors (estimated) =
',I16/
2895 & ' -- (5) maximum frontal
size (estimated) =
',I16/
2896 & ' -- (6) number of nodes in
the tree =
',I16/
2897 & ' -- (32)
Type of analysis effectively used =
',I16/
2898 & ' -- (7) ordering option effectively used =
',I16/
2899 & ' icntl(6) maximum transversal option =
',I16/
2900 & ' icntl(7) pivot order option =
',I16/
2901 & ' icntl(14) percentage of memory relaxation =
',I16/
2902 & ' icntl(15) analysis by block effectively used =
',I16/
2903 & ' icntl(18) distributed input matrix(on
if >0) =
',I16/
2904 & ' icntl(58) symbolic factorization option =
',I16/
2905 & ' number of level 2 nodes =
',I16/
2906 & ' number of
split nodes =
',I16/
2907 & ' rinfog(1) operations during elimination(estim)=
',
290999993 FORMAT(' ordering compressed/constrained(icntl(12)) =
',I16)
291099994 FORMAT(' distributed matrix entry
format (icntl(18)) =
',I16)
291199995 FORMAT(' effective schur option(icntl(19)) =
',I16/
2912 & ' Size of schur(size_schur) =
',I16)
291399996 FORMAT(' forward solution during factorization, nrhs =
',I16)
2914 END SUBROUTINE CMUMPS_DIAG_ANA
2915 SUBROUTINE CMUMPS_CUTNODES
2916 & ( N, FRERE, FILS, NFSIZ, SIZEOFBLOCKS, LSIZEOFBLOCKS,
2918 & KEEP, KEEP8, SPLITROOT, MP, LDIAG, INFO1, INFO2 )
2920 INTEGER N, NSTEPS, NSLAVES, KEEP(500)
2921 INTEGER(8) KEEP8(150)
2922 INTEGER FRERE( N ), FILS( N ), NFSIZ( N )
2923 INTEGER LSIZEOFBLOCKS
2924 INTEGER SIZEOFBLOCKS(LSIZEOFBLOCKS)
2927 INTEGER INFO1, INFO2
2928 INTEGER, DIMENSION(:), ALLOCATABLE :: IPOOL
2929 INTEGER INODE, DEPTH, I, IBEG, IEND, IIPOOL, NROOT
2930 INTEGER MAX_DEPTH, ISON, TOT_CUT, MAX_CUT, STRAT
2932 INTEGER NFRONT, K82, allocok
2934.NOT..EQ.
BLKON = (SIZEOFBLOCKS(1)-1)
2938.EQ.
IF (KEEP(210)1) THEN
2939 MAX_DEPTH = 2*NSLAVES*K82
2942.eq..AND..NOT.
IF (( NSLAVES 1 ) ( SPLITROOT) ) RETURN
2943.EQ.
IF (NSLAVES1) THEN
2946 MAX_DEPTH = int( log( real( NSLAVES - 1 ) )
2950 ALLOCATE(IPOOL(NSTEPS+1), stat=allocok)
2951.GT.
IF (allocok0) THEN
2958.eq.
IF ( FRERE(INODE) 0 ) THEN
2960 IPOOL( NROOT ) = INODE
2969 DO DEPTH = 1, MAX_DEPTH
2973.GT.
DO WHILE ( ISON 0 )
2977.GT.
DO WHILE ( ISON 0 )
2978 IPOOL( IIPOOL ) = ISON
2980 ISON = FRERE( ISON )
2983 IPOOL( IBEG ) = -IPOOL( IBEG )
2987 IPOOL( IBEG ) = -IPOOL( IBEG )
2990 MAX_CUT = NROOT*max(K82,2)
2991 INODE = abs(IPOOL(1))
2992 NFRONT = NFSIZ( INODE )
2994 & int(NFRONT,8)*int(NFRONT,8)/(int(K82+1,8)*int(K82+1,8)),
2996.NE.
IF (KEEP(53)0) THEN
3000 K79 = min(2000_8*2000_8,K79)
3001.EQ.
IF (KEEP(376) 1) THEN
3002 K79 = min(int(KEEP(9)+1,8)*int(KEEP(9)+1,8),K79)
3006 MAX_CUT = 2 * NSLAVES
3007.EQ.
IF (KEEP(210)1) THEN
3008 MAX_CUT = 4 * (MAX_CUT + 4)
3012 DO I = 1, IIPOOL - 1
3014.LT.
IF ( INODE 0 ) THEN
3018 CALL CMUMPS_SPLIT_1NODE
3019 & ( INODE, N, FRERE, FILS, NFSIZ, NSTEPS, NSLAVES,
3020 & KEEP,KEEP8, TOT_CUT, STRAT, DEPTH,
3021 & K79, SPLITROOT, MP, LDIAG,
3022 & BLKON, SIZEOFBLOCKS, LSIZEOFBLOCKS )
3023 IF ( TOT_CUT > MAX_CUT ) EXIT
3028 END SUBROUTINE CMUMPS_CUTNODES
3029 RECURSIVE SUBROUTINE CMUMPS_SPLIT_1NODE
3030 & ( INODE, N, FRERE, FILS, NFSIZ, NSTEPS, NSLAVES, KEEP,KEEP8,
3031 & TOT_CUT, STRAT, DEPTH, K79, SPLITROOT, MP, LDIAG,
3032 & BLKON, SIZEOFBLOCKS, LSIZEOFBLOCKS )
3035 INTEGER INODE, N, NSTEPS, NSLAVES, KEEP(500), STRAT,
3036 & DEPTH, TOT_CUT, MP, LDIAG
3037 INTEGER(8) KEEP8(150)
3038 INTEGER FRERE( N ), FILS( N ), NFSIZ( N )
3041 INTEGER LSIZEOFBLOCKS
3042 INTEGER SIZEOFBLOCKS(LSIZEOFBLOCKS)
3043 INTEGER I, IN, NPIV, NFRONT, NSLAVES_ESTIM
3044 REAL WK_SLAVE, WK_MASTER
3045 INTEGER INODE_SON, INODE_FATH, IN_SON, IN_FATH, IN_GRANDFATH
3046 INTEGER NPIV_COMPG, NPIV_SON_COMPG, NPIV_FATH_COMPG
3047 INTEGER NPIV_SON, NPIV_FATH, NPIV_TEMP
3048 INTEGER NCB, NSLAVESMIN, NSLAVESMAX
3049 INTEGER MUMPS_BLOC2_GET_NSLAVESMIN,
3050 & MUMPS_BLOC2_GET_NSLAVESMAX
3051 EXTERNAL MUMPS_BLOC2_GET_NSLAVESMIN,
3052 & MUMPS_BLOC2_GET_NSLAVESMAX
3053.EQ..AND..EQ..OR.
IF ( (KEEP(210)1KEEP(60)0)
3054 & (SPLITROOT) ) THEN
3055.eq.
IF ( FRERE ( INODE ) 0 ) THEN
3056 NFRONT = NFSIZ( INODE )
3062 NPIV_COMPG = NPIV_COMPG + 1
3069.GT.
IF ( int(NFRONT,8)*int(NFRONT,8)K79
3075.eq.
IF ( FRERE ( INODE ) 0 ) RETURN
3076 NFRONT = NFSIZ( INODE )
3082 NPIV = NPIV + SIZEOFBLOCKS(IN)
3084 NPIV_COMPG = NPIV_COMPG + 1
3087.NOT.
IF (BLKON) NPIV = NPIV_COMPG
3089.LE.
IF ( (NFRONT - (NPIV/2)) KEEP(9)) RETURN
3090.and..OR.
IF ((KEEP(50) == 0int(NFRONT,8) * int(NPIV,8) > K79 )
3091.NE..and.
&(KEEP(50) 0int(NPIV,8) * int(NPIV,8) > K79 )) GOTO 333
3092.EQ.
IF (KEEP(210)1) THEN
3095 NSLAVES_ESTIM = 32+NSLAVES
3097 NSLAVESMIN = MUMPS_BLOC2_GET_NSLAVESMIN
3098 & ( NSLAVES, KEEP(48), KEEP8(21), KEEP(50),
3099 & NFRONT, NCB, KEEP(375), KEEP(119))
3100 NSLAVESMAX = MUMPS_BLOC2_GET_NSLAVESMAX
3101 & ( NSLAVES, KEEP(48), KEEP8(21), KEEP(50),
3102 & NFRONT, NCB, KEEP(375), KEEP(119))
3103 NSLAVES_ESTIM = max (1,
3104 & nint( real(NSLAVESMAX-NSLAVESMIN)/real(3) )
3106 NSLAVES_ESTIM = min (NSLAVES_ESTIM, NSLAVES-1)
3108.eq.
IF ( KEEP(50) 0 ) THEN
3109 WK_MASTER = 0.6667E0 *
3110 & real(NPIV)*real(NPIV)*real(NPIV) +
3111 & real(NPIV)*real(NPIV)*real(NCB)
3112 WK_SLAVE = real( NPIV ) * real( NCB ) *
3113 & ( 2.0E0 * real(NFRONT) - real(NPIV) )
3114 & / real(NSLAVES_ESTIM)
3116 WK_MASTER = real(NPIV)*real(NPIV)*real(NPIV) / real(3)
3118 & (real(NPIV)*real(NCB)*real(NFRONT))
3119 & / real(NSLAVES_ESTIM)
3121.EQ.
IF (KEEP(210)1) THEN
3122 IF ( real( 100 + STRAT )
3123.GE.
& * WK_SLAVE / real(100) WK_MASTER ) RETURN
3125 IF ( real( 100 + STRAT * max( DEPTH-1, 1 ) )
3126.GE.
& * WK_SLAVE / real(100) WK_MASTER ) RETURN
3129.LE.
IF (NPIV 1 ) RETURN
3130 NPIV_SON = max(NPIV/2,1)
3131 NPIV_FATH = NPIV - NPIV_SON
3133 IF (NCB .NE .0) THEN
3134 WRITE(*,*) "Error splitting"
3137 NPIV_FATH = min(int(sqrt(real(K79))), int(NPIV/2))
3138 NPIV_SON = NPIV - NPIV_FATH
3145 DO WHILE (IN_SON > 0)
3146 NPIV_TEMP = NPIV_TEMP + SIZEOFBLOCKS(IN_SON)
3147 NPIV_SON_COMPG = NPIV_SON_COMPG +1
3148.GE.
IF (NPIV_TEMPNPIV_SON) EXIT
3149 IN_SON = FILS( IN_SON )
3151 NPIV_FATH_COMPG = NPIV_COMPG - NPIV_SON_COMPG
3152 NPIV_SON = NPIV_TEMP
3153 NPIV_FATH = NPIV - NPIV_SON
3155 NPIV_SON_COMPG = NPIV_SON
3156 NPIV_FATH_COMPG = NPIV_FATH
3158 DO I = 1, NPIV_SON_COMPG - 1
3159 IN_SON = FILS( IN_SON )
3162.EQ.
IF (NPIV_FATH_COMPG0) RETURN
3164 TOT_CUT = TOT_CUT + 1
3165 INODE_FATH = FILS( IN_SON )
3166.LT.
IF ( INODE_FATH 0 ) THEN
3167 write(*,*) 'error: inode_fath < 0
', INODE_FATH
3169 IN_FATH = INODE_FATH
3170 DO WHILE ( FILS( IN_FATH ) > 0 )
3171 IN_FATH = FILS( IN_FATH )
3173 FRERE( INODE_FATH ) = FRERE( INODE_SON )
3174 FRERE( INODE_SON ) = - INODE_FATH
3175 FILS ( IN_SON ) = FILS( IN_FATH )
3176 FILS ( IN_FATH ) = - INODE_SON
3177 IN = FRERE( INODE_FATH )
3181.eq.
IF ( IN 0 ) GO TO 10
3183 DO WHILE ( FILS( IN ) > 0 )
3187.eq.
IF ( FILS( IN_GRANDFATH ) - INODE_SON ) THEN
3188 FILS( IN_GRANDFATH ) = -INODE_FATH
3192 DO WHILE ( FRERE( IN ) > 0 )
3193.eq.
IF ( FRERE( IN ) INODE_SON ) THEN
3194 FRERE( IN ) = INODE_FATH
3199 WRITE(*,*) 'error 2 in
split node
',
3200 & IN_GRANDFATH, IN, FRERE(IN)
3203 NFSIZ(INODE_SON) = NFRONT
3204 NFSIZ(INODE_FATH) = NFRONT - NPIV_SON
3205 KEEP(2) = max( KEEP(2), NFRONT - NPIV_SON )
3209 CALL CMUMPS_SPLIT_1NODE
3210 & ( INODE_FATH, N, FRERE, FILS, NFSIZ, NSTEPS,
3211 & NSLAVES, KEEP,KEEP8, TOT_CUT, STRAT, DEPTH,
3212 & K79, SPLITROOT, MP, LDIAG,
3213 & BLKON, SIZEOFBLOCKS, LSIZEOFBLOCKS )
3214.NOT.
IF ( SPLITROOT) THEN
3215 CALL CMUMPS_SPLIT_1NODE
3216 & ( INODE_SON, N, FRERE, FILS, NFSIZ, NSTEPS,
3217 & NSLAVES, KEEP,KEEP8, TOT_CUT, STRAT, DEPTH,
3218 & K79, SPLITROOT, MP, LDIAG,
3219 & BLKON, SIZEOFBLOCKS, LSIZEOFBLOCKS )
3222 END SUBROUTINE CMUMPS_SPLIT_1NODE
3223 SUBROUTINE CMUMPS_ANA_GNEW
3224 & (N, NZ, IRN, ICN, IW, LW, IPE, LEN,
3226 & NRORM, NIORM, IFLAG,IERROR, ICNTL,
3227 & symmetry, SYM, NBQD, AvgDens,
3228 & KEEP264, KEEP265, PRINTSTAT,
3229 & INPLACE64_GRAPH_COPY
3232 INTEGER, intent(in) :: N, SYM
3233 INTEGER(8), intent(in) :: LW
3234 INTEGER(8), intent(in) :: NZ
3235 INTEGER, intent(in) :: ICNTL(60)
3236 INTEGER, intent(in) :: IRN(NZ), ICN(NZ)
3237 INTEGER, intent(out) :: IERROR, symmetry
3238 INTEGER, intent(out) :: NBQD, AvgDens
3239 INTEGER, intent(out) :: LEN(N), IW(LW)
3240 INTEGER(8), intent(out):: IWFR
3241 INTEGER(8), intent(out):: NRORM, NIORM
3242 INTEGER(8), intent(out):: IPE(N+1)
3243 INTEGER, intent(inout) :: IFLAG, KEEP264, KEEP265
3244 INTEGER(8), intent(out):: IQ(N)
3245 INTEGER, intent(out) :: FLAG(N)
3246 LOGICAL, intent(in) :: PRINTSTAT
3247 LOGICAL, intent(inout) :: INPLACE64_GRAPH_COPY
3248 INTEGER :: MP, MPG, I, J, N1
3249 INTEGER :: NBERR, THRESH
3250 INTEGER(8) :: K8, K1, K2, LAST, NDUP
3251 INTEGER(8) :: NZOFFA, NDIAGA, L, N8
3263.EQ.
IF (KEEP2640) THEN
3264.EQ..AND..EQ.
IF ((SYM0)(KEEP265-1)) THEN
3268.GT..OR..GT..OR..LT.
IF ((IN)(JN)(I1)
3269.OR..LT.
& (J1)) THEN
3273 IPE(I) = IPE(I) + 1_8
3274 NZOFFA = NZOFFA + 1_8
3276 NDIAGA = NDIAGA + 1_8
3284.GT..OR..GT..OR..LT.
IF ((IN)(JN)(I1)
3285.OR..LT.
& (J1)) THEN
3289 IPE(I) = IPE(I) + 1_8
3290 IPE(J) = IPE(J) + 1_8
3291 NZOFFA = NZOFFA + 1_8
3293 NDIAGA = NDIAGA + 1_8
3299.EQ..AND..EQ.
IF ((SYM0)(KEEP265-1)) THEN
3304 NDIAGA = NDIAGA + 1_8
3306 IPE(I) = IPE(I) + 1_8
3307 NZOFFA = NZOFFA + 1_8
3315 IPE(I) = IPE(I) + 1_8
3316 IPE(J) = IPE(J) + 1_8
3317 NZOFFA = NZOFFA + 1_8
3319 NDIAGA = NDIAGA + 1_8
3324 NIORM = NZOFFA + 3_8*N8
3325.GE.
IF (IERROR1) THEN
3327.EQ.
IF (mod(IFLAG,2) 0) IFLAG = IFLAG+1
3328.GT..AND..GE.
IF ((MP0)(ICNTL(4)2)) THEN
3333.GT..OR..GT..OR..LT.
IF ((IN)(JN)(I1)
3334.OR..LT.
& (J1)) THEN
3336.LE.
IF (NBERR10) THEN
3337.GT..OR..EQ..OR.
IF (mod(K8,10_8)3_8 mod(K8,10_8)0_8
3338.LE..AND..LE.
& (10_8K8 K820_8)) THEN
3339 WRITE (MP,'(i16,a,i10,a,i10,a)
')
3340 & K8,'th entry(in row
',I,' and column
',J,') ignored
'
3342.EQ.
IF (mod(K8,10_8)1_8)
3343 & WRITE(MP,'(i16,a,i10,a,i10,a)
')
3344 & K8,'st entry(in row
',I,' and column
',J,') ignored
'
3345.EQ.
IF (mod(K8,10_8)2_8)
3346 & WRITE(MP,'(i16,a,i10,a,i10,a)
')
3347 & K8,'nd entry(in row
',I,' and column
',J,') ignored
'
3348.EQ.
IF (mod(K8,10_8)3_8)
3349 & WRITE(MP,'(i16,a,i10,a,i10,a)
')
3350 & K8,'rd entry(in row
',I,' and column
',J,') ignored
'
3359 100 NRORM = NIORM - 2_8*N8
3364 IQ(I+1) = IPE(I) + IQ(I)
3367 LAST = max(IPE(N)+IQ(N)-1,IQ(N))
3372.EQ.
IF (KEEP264 0) THEN
3373.EQ..AND..EQ.
IF ((SYM0)(KEEP265-1)) THEN
3378.GE..AND..LE.
IF ((J1)(IN)) THEN
3384.EQ.
ELSE IF (KEEP2651) THEN
3389.GE..AND..LE.
IF ((J1)(IN)) THEN
3403.GE..AND..LE.
IF ((I1)(JN)) THEN
3408.GE..AND..LE.
IF ((J1)(IN)) THEN
3417.EQ..AND..EQ.
IF ((SYM0)(KEEP265-1)) THEN
3426.EQ.
ELSE IF (KEEP2651) THEN
3453.EQ.
IF (KEEP2650) THEN
3464.EQ.
IF (FLAG(J)I) THEN
3475 LEN(I) = int((IQ(I) - IPE(I)))
3478.NE.
IF (NDUP0_8) THEN
3481.EQ.
IF (LEN(I)0) THEN
3486 K2 = K1 + LEN(I) - 1
3490.NE.
IF (IW(K8)0) THEN
3495 LEN(I) = int(IWFR - L)
3500 IPE(N+1) = IPE(N) + int(LEN(N),8)
3505 LEN(I) = int(IQ(I) - IPE(I))
3508 IPE(I+1) = IPE(I) + int(LEN(I),8)
3514 RSYM = real(NDIAGA+2_8*NZOFFA - (IWFR-1_8))/
3515 & real(NZOFFA+NDIAGA)
3516.EQ..AND..EQ.
IF ((KEEP2650) (NZOFFA - (IWFR-1_8))0_8)
3520 symmetry = min(nint (100.0E0*RSYM), 100)
3522.GT..AND..GE.
IF ((MPG 0)(ICNTL(4)2) )
3523 & write(MPG,'(a,i5)
')
3524 & ' ... structural symmetry(in percent)=
', symmetry
3525.GT..AND..NE..AND..GE.
IF (MP0 MPGMP (ICNTL(4)2) )
3526 & write(MP,'(a,i5)
')
3527 & ' ... structural symmetry(in percent)=
', symmetry
3531 AvgDens = nint(real(IWFR-1_8)/real(N))
3532 THRESH = AvgDens*50 - AvgDens/10 + 1
3537.GT.
IF (JTHRESH) NBQD = NBQD+1
3540.GE.
INPLACE64_GRAPH_COPY = (LW2*(IWFR-1_8))
3542.GT..AND..GE.
IF (MPG 0(ICNTL(4)2))
3543 & write(MPG,'(a,1i5)
')
3544 & ' average density of rows/columns =
', AvgDens
3545.GT..AND..NE..AND..GE.
IF (MP0 MPGMP(ICNTL(4)2))
3546 & write(MP,'(a,1i5)
')
3547 & ' average density of rows/columns =
', AvgDens
355099999 FORMAT (/'*** warning message from analysis routine ***
')
3551 END SUBROUTINE CMUMPS_ANA_GNEW
3552 SUBROUTINE CMUMPS_SET_K821_SURFACE
3553 & (KEEP821, KEEP2, KEEP48 ,KEEP50, NSLAVES)
3555 INTEGER NSLAVES, KEEP2, KEEP48, KEEP50
3556 INTEGER (8) :: KEEP821
3557 INTEGER(8) KEEP2_SQUARE, NSLAVES8
3558 NSLAVES8= int(NSLAVES,8)
3559 KEEP2_SQUARE = int(KEEP2,8) * int(KEEP2,8)
3560 KEEP821 = max(KEEP821*int(KEEP2,8),1_8)
3562 KEEP821 = min(1500000_8, KEEP821)
3564 KEEP821 = min(3000000_8, KEEP821)
3566 KEEP821 = min(2000000_8, KEEP821)
3569.GT.
IF (NSLAVES 64) THEN
3571 & min(8_8*KEEP2_SQUARE/NSLAVES8+1_8, KEEP821)
3574 & min(4_8*KEEP2_SQUARE/NSLAVES8+1_8, KEEP821)
3577.GT.
IF (NSLAVES64) THEN
3579 & min(6_8*KEEP2_SQUARE/NSLAVES8+1_8, KEEP821)
3582 & min(4_8*KEEP2_SQUARE/NSLAVES8+1_8, KEEP821)
3585.EQ.
IF (KEEP50 0 ) THEN
3586 KEEP821 = max(KEEP821,(7_8*KEEP2_SQUARE /
3587 & 4_8 / int(max(NSLAVES-1,1),8)) + int(KEEP2,8))
3589 KEEP821 = max(KEEP821,(7_8*KEEP2_SQUARE /
3590 & 4_8 / int(max(NSLAVES-1,1),8)) + int(KEEP2,8))
3592.EQ.
IF (KEEP50 0 ) THEN
3594 KEEP821 = max(KEEP821,200000_8)
3596 KEEP821 = max(KEEP821,300000_8)
3600 KEEP821 = max(KEEP821,40000_8)
3602 KEEP821 = max(KEEP821,80000_8)
3607 END SUBROUTINE CMUMPS_SET_K821_SURFACE
3608 SUBROUTINE CMUMPS_MTRANS_DRIVER(JOB,M,N,NE,
3609 & IP,IRN,A,LA,NUM,PERM,LIW,IW,LDW,DW,
3611 & ICNTL,CNTL,INFO, INFOMUMPS)
3613 INTEGER :: NICNTL, NCNTL, NINFO, INFOMUMPS(80)
3614 PARAMETER (NICNTL=10, NCNTL=10, NINFO=10)
3615 INTEGER :: JOB,M,N,NUM
3616 INTEGER(8), INTENT(IN) :: NE, LIW,LDW, LA
3617 INTEGER(8) :: IP(N+1), IPQ8(N)
3618 INTEGER :: IRN(NE),PERM(M),IW(LIW)
3619 INTEGER :: ICNTL(NICNTL),INFO(NINFO)
3621 REAL :: DW(LDW),CNTL(NCNTL)
3622 INTEGER(8), DIMENSION(:), ALLOCATABLE :: IWtemp8
3624 INTEGER :: I,J,WARN1,WARN2,WARN4
3626 REAL :: FACT,ZERO,ONE,RINF,RINF2,RINF3
3627 PARAMETER (ZERO=0.0E+00,ONE=1.0E+0)
3628 EXTERNAL CMUMPS_MTRANSZ,CMUMPS_MTRANSB,CMUMPS_MTRANSR,
3629 & CMUMPS_MTRANSS,CMUMPS_MTRANSW
3632 RINF2 = huge(RINF2)/real(2*N)
3637.LT..OR..GT.
IF (JOB1 JOB6) THEN
3640.GE.
IF (ICNTL(1)0) WRITE(ICNTL(1),9001) INFO(1),'job',job
3643 IF (m.LT.1 .OR. m.LT.n)
THEN
3646 IF (icntl(1).GE.0)
WRITE(icntl
'M'
3652 IF (icntl(1).GE.0)
WRITE(icntl(1),9001) info(1),
'N',n
3658 IF (icntl(1).GE.0)
WRITE(icntl(1),9001) info(1),
'NE',ne
3661 IF (job.EQ.1) k = int
3662 IF (job.EQ.2) k = int(n + 2*m,8)
3663 IF (job.EQ.3) k = int(8*n + 2*m + ne,8)
3664 IF (job.EQ.4) k = int(n + m,8)
3665 IF (job.EQ.5) k = int(3*n + 2*m,8)
3666 IF (job.EQ.6) k = int(3*n + 2*m + ne,8)
3670 IF (icntl(1).GE.0)
WRITE(icntl(1),9004) info(1),k
3674 IF (job.EQ.2) k = int( m,8)
3675 IF (job.EQ.3) k = int(1,8)
3676 IF (job.EQ.4) k = int( 2*m,8)
3677 IF (job.EQ.5) k = int(n + 2*m,8)
3678 IF (job.EQ.6) k = int(n + 3*m,8)
3679 IF (ldw .LT. k)
THEN
3682 IF (icntl(1).GE.0)
WRITE(icntl(1),9005) info(1),k
3686 IF (icntl(5).EQ.0)
THEN
3691 DO 4 k = ip(j),ip(j+1)-1_8
3693 IF (i.LT.1 .OR. i.GT.m)
THEN
3696 IF (icntl(1).GE.0)
WRITE(icntl(1),9006) info(1),j,i
3699 IF (iw(i).EQ.j)
THEN
3702 IF (icntl(1).GE.0)
WRITE(icntl(1),9007) info(1),j,i
3710 IF (icntl(3).GT.0)
THEN
3711 IF (icntl(4).EQ.0 .OR. icntl(4).EQ.1)
THEN
3712 WRITE(icntl(3),9020) job,m,n,ne
3713 IF (icntl(4).EQ.0)
THEN
3714 WRITE(icntl(3),9021) (ip(j),j=1,
min(10,n+1))
3715 WRITE(icntl(3),9022) (irn(k),k=1_8,
min(10_8,ne))
3716 IF (job.GT.1)
WRITE(icntl(3),9023)
3717 & (a(k),k=1_8,
min(10_8,ne))
3718 ELSEIF (icntl(4).EQ.1)
THEN
3719 WRITE(icntl(3),9021) (ip(j),j=1,n+1)
3720 WRITE(icntl(3),9022) (irn(k),k=1_8,ne)
3721 IF (job.GT.1)
WRITE(icntl(3),9023) (a(k),k=1_8,ne)
3723 WRITE(icntl(3),9024) (icntl(j),j=1,nicntl)
3724 WRITE(icntl(3),9025) (cntl(j),j=1,ncntl)
3732 iw(j) = int(ip(j+1) - ip(j))
3735 & iw(n+1),iw(2*n+1),iw(3*n+1),iw(3*n+m+1))
3739 dw(1) =
max(zero,cntl(1))
3741 & iw(1),ipq8,iw(n+1),iw(n+m+1),dw,rinf2)
3751 & iw(ne+n+1),iw(ne+2*n+1),iw(ne+3*n+1),iw(ne+4*n+1),
3752 & iw(ne+5*n+1),iw(ne+5*n+m+1),fact,rinf2)
3755 IF ((job.EQ.4).OR.(job.EQ.5).or.(job.EQ.6))
THEN
3756 ALLOCATE(iwtemp8(m+n+n), stat=allocok)
3757 IF (allocok.GT.0)
THEN
3759 infomumps(2) = m+n+n
3766 DO 30 k = ip(j),ip(j+1)-1_8
3767 IF (abs(a(k)).GT.fact) fact = abs(a(k))
3769 IF(fact .GT. rinf3) rinf3 = fact
3770 DO 40 k = ip(j),ip(j+1)-1_8
3771 a(k) = fact - abs(a(k))
3774 dw(1) =
max(zero,cntl(1))
3776 iwtemp8(1) = int(job,8)
3778 & iwtemp8(1),iw(1),iwtemp8(n+1),ipq8,iw(n+1),
3780 & dw(1),dw(m+1),rinf2)
3784 IF (job.EQ.5 .or. job.EQ.6)
THEN
3789 DO 60 k = ip(j),ip(j+1)-1_8
3790 IF (a(k).GT.fact) fact = a(k)
3793 IF (fact.NE.zero)
THEN
3795 IF(fact .GT. rinf3) rinf3=fact
3796 DO 70 k = ip(j),ip(j+1)-1_8
3797 IF (a(k).NE.zero)
THEN
3798 a(k) = fact - log(a(k))
3799 IF(a(k) .GT. rinf3) rinf3=a(k)
3805 DO 71 k = ip(j),ip(j+1)-1_8
3813 iw(3*n+2*m+k) = irn(k)
3819 DO 62 k = ip(j),ip(j+1)-1_8
3821 IF (a(k).GT.dw(2*m+n+i))
THEN
3827 IF (dw(2*m+n+i).NE.zero)
THEN
3828 dw(2*m+n+i) = 1.0e0/dw(2*m+n+i)
3832 DO 65 k = ip(j),ip(j+1)-1
3834 a(k) = dw(2*m+n+i) * a(k)
3839 IF (ip(j).NE.ip(j+1))
THEN
3845 IF (fact.NE.zero)
THEN
3847 DO 170 k = ip(j),ip(j+1)-1_8
3848 IF (a(k).NE.zero)
THEN
3849 a(k) = fact - log(a(k))
3850 IF(a(k) .GT. rinf3) rinf3=a(k)
3856 DO 171 k = ip(j),ip(j+1)-1_8
3862 dw(1) =
max(zero,cntl(1))
3865 iwtemp8(1) = int(job,8)
3868 & iwtemp8(1),iw(1),iwtemp8(n+1),ipq8,iw(n+1),
3870 & dw(1),dw(m+1),rinf2)
3874 & iwtemp8(1),iw(1),iwtemp8(n+1),ipq8,iw(n+1),
3876 & dw(1),dw(m+1),rinf2)
3878 IF ((job.EQ.5).or.(job.EQ.6))
THEN
3883 IF (dw(2*m+n+i).NE.0.0e0)
THEN
3884 dw(i) = dw(i) + log(dw(2*m+n+i))
3890 IF (dw(2*m+j).NE.zero)
THEN
3897 fact = 0.5e0*log(rinf2)
3899 IF (dw(i).LT.fact)
GO TO 86
3904 IF (dw(m+j).LT.fact)
GO TO 87
3909 90
IF (infomumps(1).LT.0)
RETURN
3910 IF (num.LT.n) warn1 = 1
3911 IF (job.EQ.4 .OR. job.EQ.5 .OR. job.EQ.6)
THEN
3912 IF (cntl(1).LT.zero) warn4 = 4
3914 IF (info(1).EQ.0)
THEN
3915 info(1) = warn1 + warn2 + warn4
3916 IF (info(1).GT.0 .AND. icntl(2).GT.0)
THEN
3917 WRITE(icntl(2),9010) info(1)
3918 IF (warn1.EQ.1)
WRITE(icntl(2),9011)
3919 IF (warn2.EQ.2)
WRITE(icntl(2),9012)
3920 IF (warn4.EQ.4)
WRITE(icntl(2),9014)
3923 IF (icntl(3).GE.0)
THEN
3924 IF (icntl(4).EQ.0 .OR. icntl(4).EQ.1)
THEN
3925 WRITE(icntl(3),9030) (info(j),j=1,2)
3926 WRITE(icntl(3),9031) num
3927 IF (icntl(4).EQ.0)
THEN
3928 WRITE(icntl(3),9032) (perm(j),j=1,
min(10,m))
3929 IF (job.EQ.5 .OR. job.EQ.6)
THEN
3930 WRITE(icntl(3),9033) (dw(j),j=1,
min(10,m))
3931 WRITE(icntl(3),9034) (dw(m+j),j=1,
min(10,n))
3933 ELSEIF (icntl(4).EQ.1)
THEN
3934 WRITE(icntl(3),9032) (perm(j),j=1,m)
3935 IF (job.EQ.5 .OR. job.EQ.6)
THEN
3936 WRITE(icntl(3),9033) (dw(j),j=1,m)
3937 WRITE(icntl(3),9034) (dw(m+j),j=1,n)
3943 9001
FORMAT (
' ****** Error in CMUMPS_MTRANSA. INFO(1) = ',i2,
3944 &
' because ',(a),
' = ',i14)
3945 9004
FORMAT (
' ****** Error in CMUMPS_MTRANSA. INFO(1) = ',i2/
3946 &
' LIW too small, must be at least ',i14)
3947 9005
FORMAT (
' ****** Error in CMUMPS_MTRANSA. INFO(1) = ',i2
3948 &
' LDW too small, must be at least ',i14)
3949 9006
FORMAT (
' ****** Error in CMUMPS_MTRANSA. INFO(1) = ',i2/
3951 &
' contains an entry with invalid row index ',i8)
3952 9007
FORMAT (
' ****** Error in CMUMPS_MTRANSA. INFO(1) = ',i2/
3954 &
' contains two or more entries with row index ',i8)
3955 9010
FORMAT (
' ****** Warning from CMUMPS_MTRANSA. INFO(1) = ',i2)
3956 9011
FORMAT (
' - The matrix is structurally singular.')
3957 9012
FORMAT (
' - Some scaling factors may be too large.')
3958 9014
FORMAT (
' - CNTL(1) is negative and was treated as zero.')
3959 9020
FORMAT (
' ****** Input parameters for CMUMPS_MTRANSA:'/
3960 &
' JOB =',i10/
' M =',i10/
' N =',i10/
' NE =',i14)
3961 9021
FORMAT (
' IP(1:N+1) = ',8i8/(15x,8i8))
3962 9022
FORMAT (
' IRN(1:NE) = ',8i8/(15x,8i8))
3963 9023
FORMAT (
' A(1:NE) = ',4(1pd14.4)/(15x,4(1pd14.4)))
3964 9024
FORMAT (
' ICNTL(1:10) = ',8i8/(15x,2i8))
3965 9025
FORMAT (
' CNTL(1:10) = ',4(1pd14.4)/(15x,4(1pd14.4)))
3966 9030
FORMAT (
' ****** Output parameters for CMUMPS_MTRANSA:'/
3967 &
' INFO(1:2) = ',2i8)
3968 9031
FORMAT (
' NUM = ',i8)
3969 9032
FORMAT (
' PERM(1:M) = ',8i8/(15x,8i8))
3970 9033
FORMAT (
' DW(1:M) = ',5(f11.3)/(15x,5(f11.3)))
3971 9034
FORMAT (
' DW(M+1:M+N) = ',5(f11.3)/(15x,5(f11.3)))
3975 INTEGER,
INTENT(IN) :: N
3976 INTEGER(8),
INTENT(INOUT) :: NZ
3977 INTEGER(8),
INTENT(INOUT) :: IP(N+1)
3978 INTEGER,
INTENT(INOUT) :: IRN()
3979 REAL,
INTENT(INOUT) :: A(NZ)
3980 INTEGER,
INTENT(OUT) :: FLAG(N)
3981 INTEGER(8),
INTENT(OUT) :: POSI(N)
3983 INTEGER(8) :: , WR_POS, BEG_COL, SV_POS
3988 DO k=ip(col),ip(col+1)-1_8
3990 IF(flag(row) .NE. col)
THEN
3998 a(sv_pos) = a(sv_pos) + a(k)
4009 INTEGER,
INTENT(IN) :: N
4010 INTEGER(8),
INTENT(INOUT) :: NZ
4011 INTEGER(8),
INTENT(INOUT) :: IP(N+1)
4012 INTEGER,
INTENT(INOUT) :: IRN(NZ)
4013 INTEGER,
INTENT(OUT) :: FLAG(N)
4015 INTEGER(8) :: K, WR_POS, BEG_COL
4020 DO k=ip(col),ip(col+1)-1_8
4022 IF(flag(row) .NE. col)
THEN
4036 & DAD_STEPS, STEP, NSTEPS,
4037 & KEEP60, KEEP20, KEEP38,
4040 INTEGER,
INTENT(IN) :: N, NSTEPS, LNA
4041 INTEGER,
INTENT(IN) :: FILS( N ), STEP(N), NA(LNA)
4042 INTEGER,
INTENT(IN) :: DAD_STEPS ( NSTEPS ), NE_STEPS (NSTEPS)
4043 INTEGER,
INTENT(IN) :: KEEP60, KEEP20, KEEP38
4044 INTEGER,
INTENT(INOUT) :: INFO(80)
4045 INTEGER,
INTENT(OUT) :: PERM( N )
4046 INTEGER :: IPERM, INODE, IN, ISCHUR
4047 INTEGER :: INBLEAF, INBROOT, allocok
4048 INTEGER,
ALLOCATABLE,
DIMENSION (:) :: POOL, NSTK
4051 ALLOCATE(pool(inbleaf), nstk(nsteps), stat=allocok)
4052 IF (allocok > 0 )
THEN
4054 info(2) = inbleaf + nsteps
4057 pool(1:inbleaf) = na(3:2+inbleaf)
4058 nstk(1:nsteps) = ne_steps(1:nsteps)
4060 IF ( keep60.GT.0 )
THEN
4061 ischur =
max(keep20, keep38)
4064 DO WHILE ( inbleaf .NE. 0 )
4065 inode = pool( inbleaf )
4066 inbleaf = inbleaf - 1
4068 IF (inode.NE.ischur)
THEN
4069 DO WHILE ( in .GT. 0 )
4075 in = dad_steps(step( inode ))
4076 IF ( in .eq. 0 )
THEN
4077 inbroot = inbroot - 1
4079 nstk( step(in) ) = nstk( step(in) ) - 1
4080 IF ( nstk( step(in) ) .eq. 0 )
THEN
4081 inbleaf = inbleaf + 1
4082 pool( inbleaf ) = in
4086 IF (iperm.LE.n)
THEN
4087 IF (ischur.GT.0)
THEN
4089 DO WHILE ( in .GT. 0 )
4096 DEALLOCATE(pool, nstk)
4100 & N, NBLK, BLKPTR, BLKVAR,
4101 & FILS_OLD, FILS_NEW, NSTEPS,
4102 & STEP_OLD, STEP_NEW, PAR2_NODES, NB_NIV2,
4103 & DAD_STEPS, FRERE_STEPS,
4104 & NA, LNA, LRGROUPS_OLD, LRGROUPS_NEW,
4108 INTEGER,
INTENT(IN) :: N, NBLK, ICNTL(60), NSTEPS, LNA,
4110 INTEGER,
INTENT(IN) :: BLKPTR(NBLK+1), (N)
4111 INTEGER,
INTENT(IN) :: FILS_OLD(NBLK), STEP_OLD(NBLK),
4112 & lrgroups_old(nblk)
4113 INTEGER,
INTENT(OUT) :: FILS_NEW(N), STEP_NEW(N),
4115 INTEGER,
INTENT(INOUT) :: DAD_STEPS(NSTEPS), FRERE_STEPS(NSTEPS)
4116 INTEGER,
INTENT(INOUT) :: NA(LNA), PAR2_NODES(NB_NIV2), K20, K38
4117 INTEGER :: IB, I, IBFS, IBNB, IFS, INB
4118 INTEGER NBLEAF, NBROOT, ISTEP, IGROUP
4120 IF (K20.GT.0) K20 = blkvar(blkptr(k20))
4121 IF (k38.GT.0) k38 = blkvar(blkptr(k38))
4125 DO i= 3, 3+nbleaf+nbroot-1
4127 inb = blkvar(blkptr(ibnb))
4131 IF (par2_nodes(1).GT.0)
THEN
4133 ibnb = par2_nodes(i)
4134 inb = blkvar(blkptr(ibnb))
4143 inb = blkvar(blkptr(ibnb))
4148 ibnb = frere_steps(i)
4152 inb = blkvar(blkptr(abs(ibnb)))
4153 IF (ibnb.LT.0) inb=-inb
4155 frere_steps(i) = inb
4162 ifs = blkvar(blkptr(abs(ibfs)))
4163 IF (ibfs.LT.0) ifs=-ifs
4165 IF (blkptr(ib+1)-blkptr(ib).EQ.0) cycle
4166 DO ii=blkptr(ib), blkptr(ib+1)-1
4167 IF (ii.LT. blkptr(ib+1)-1)
THEN
4168 fils_new(blkvar(ii))= blkvar(ii+1)
4170 fils_new(blkvar(ii))= ifs
4175 istep = step_old(ib)
4176 IF (blkptr(ib+1)-blkptr(ib).EQ.0) cycle
4177 IF (istep.LT.0)
THEN
4178 DO ii=blkptr(ib), blkptr(ib+1)-1
4179 step_new(blkvar(ii)) = istep
4182 i = blkvar(blkptr(ib))
4184 DO ii=blkptr(ib)+1, blkptr(ib+1)-1
4185 step_new(blkvar(ii)) = -istep
4190 igroup = lrgroups_old(ib)
4191 IF (blkptr(ib+1)-blkptr(ib).EQ.0) cycle
4192 DO ii=blkptr(ib), blkptr(ib+1)-1
4193 lrgroups_new(blkvar(ii)) = igroup
4199 & ICNTL,INFOG, NE, NFSIZ,
4201 & KEEP,KEEP8,PROCNODE,
4202 & SSARBR,NBSA,PEAK,IERR
4203 & , SIZEOFBLOCKS, LSIZEOFBLOCKS
4207 INTEGER N, NSLAVES, NBSA, IERR
4208 INTEGER ICNTL(60),INFOG(80),KEEP(500)
4209 INTEGER(8) KEEP8(150)
4210 INTEGER NE(N),NFSIZ(N),FRERE(N),FILS(N),PROCNODE(N)
4213 INTEGER,
intent(IN) :: LSIZEOFBLOCKS
4214 INTEGER,
intent(IN) :: SIZEOFBLOCKS(LSIZEOFBLOCKS)
4216 & icntl,infog, ne, nfsiz,
4218 & keep,keep8,procnode,
4219 & ssarbr,nbsa,dble(peak),ierr
4220 & , sizeofblocks, lsizeofblocks
4225 INTEGER,
intent(in) :: INODE, N, VALUE
4226 INTEGER,
intent(in) :: FILS(N)
4227 INTEGER,
intent(inout) :: PROCNODE(N)
4231 procnode( in ) =
VALUE
subroutine mumps_ana_h(totel, compute_perm, n, iwlen, pe, pfree, len, iw, nv, elen, last, ncmpa, degree, head, next, w, parent)
subroutine mumps_set_ordering(n, keep, sym, nprocs, iord, nbqd, avgdens, prok, mp)
subroutine cmumps_ldlt_compress(n, nz, irn, icn, piv, ncmp, iw, lw, ipe, len, iq, flag, icmp, iwfr, ierror, keep, keep8, icntl, inplace64_graph_copy)
subroutine cmumps_set_constraints(n, piv, frere, fils, nfsiz, ikeep, ncst, keep, keep8, rowsca)
subroutine cmumps_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 cmumps_expand_permutation(n, ncmp, n11, n22, piv, invperm, perm)
subroutine cmumps_expand_tree_steps(icntl, n, nblk, blkptr, blkvar, fils_old, fils_new, nsteps, step_old, step_new, par2_nodes, nb_niv2, dad_steps, frere_steps, na, lna, lrgroups_old, lrgroups_new, k20, k38)
subroutine cmumps_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 cmumps_ana_k(n, ipe, iw, lw, iwfr, ips, ipv, nv, flag, ncmpa, size_schur, parent)
subroutine cmumps_sort_perm(n, na, lna, ne_steps, perm, fils, dad_steps, step, nsteps, keep60, keep20, keep38, info)
subroutine cmumps_suppress_duppli_str(n, nz, ip, irn, flag)
subroutine cmumps_mtrans_driver(job, m, n, ne, ip, irn, a, la, num, perm, liw, iw, ldw, dw, ipq8, icntl, cntl, info, infomumps)
subroutine cmumps_ana_j(n, nz, irn, icn, perm, iw, lw, ipe, iq, flag, iwfr, iflag, ierror, mp)
subroutine cmumps_set_procnode(inode, procnode, value, fils, n)
subroutine cmumps_ana_m(ne, nd, nsteps, maxfr, maxelim, k50, sizefac_tot, maxnpiv, k5, k6, panel_size, k253)
subroutine cmumps_dist_avoid_copies(n, nslaves, icntl, infog, ne, nfsiz, frere, fils, keep, keep8, procnode, ssarbr, nbsa, peak, ierr, sizeofblocks, lsizeofblocks)
subroutine cmumps_suppress_duppli_val(n, nz, ip, irn, a, flag, posi)
subroutine cmumps_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 cmumps_mtranss(m, n, ne, ip, irn, a, iperm, numx, w, len, lenl, lenh, fc, iw, iw4, rlx, rinf)
subroutine cmumps_mtransz(m, n, irn, lirn, ip, lenc, iperm, num, pr, arp, cv, out)
subroutine cmumps_mtransb(m, n, ne, ip, irn, a, iperm, num, jperm, pr, q, l, d, rinf)
subroutine cmumps_mtransr(n, ne, ip, irn, a)
subroutine cmumps_mtransw(m, n, ne, ip, irn, a, iperm, num, jperm, l32, out, pr, q, l, u, d, rinf)
end diagonal values have been computed in the(sparse) matrix id.SOL
for(i8=*sizetab-1;i8 >=0;i8--)
subroutine cmumps_ana_f(n, nz8, irn, icn, liwalloc, ikeep1, ikeep2, ikeep3, iord, nfsiz, fils, frere, listvar_schur, size_schur, icntl, info, keep, keep8, nslaves, piv, cntl4, colsca, rowsca, norig_arg, sizeofblocks, gcomp_provided_in, gcomp)
subroutine cmumps_ana_o(n, nz, mtrans, perm, ikeepalloc, idirn, idjcn, ida, idrowsca, idcolsca, work2, keep, icntl, info, infog)
subroutine, public mumps_distribute(n, slavef, icntl, info, ne, nfsiz, frere, fils, keep, keep8, procnode, ssarbr, nbsa, peak, istat, sizeofblocks, lsizeofblocks)
void split(mapping_t *, PORD_INT, PORD_INT, PORD_INT, PORD_INT *, PORD_INT *, FLOAT *, PORD_INT)