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)
44INTEGER,
INTENT(OUT) :: NFSIZ(:), FILS(:), FRERE(:)
45 INTEGER,
INTENT(INOUT) :: PIV(:)
46 INTEGER,
INTENT(INOUT) :: IKEEP1(:), IKEEP2(:), IKEEP3(:)
47 DOUBLE PRECISION :: CNTL4
48 DOUBLE PRECISION,
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 ::
65 INTEGER,
DIMENSION(:),
ALLOCATABLE :: WTEMP
67 INTEGER I, K, NCMPA, , 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 DOUBLE PRECISION,
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 dmumps_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: DMUMPS_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.0d0)
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(
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),
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)
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 IF (info(1).LT.0)
GOTO 90
967 ELSE IF ((keep(106).EQ.4).AND.(keep(60).EQ.0).AND.
968 & (.NOT.
present(sizeofblocks) .OR. (norig.EQ.n))
970 WRITE(mp,*)
" Undefined option for ICNTL(58) "
974 ALLOCATE( wtemp( 2*n ), stat = ierr )
975 IF ( ierr .GT. 0 )
THEN
981 IF (keep(60) == 0)
THEN
987 IF (
present(sizeofblocks))
THEN
989 iwl1(i) = sizeofblocks(i)
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 dmumps_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 IF (keep(60) .EQ. 0)
THEN
1014 CALL dmumps_ana_k(n, ipe(1), iw(1), liw8, iwfr8, ikeep1(1),
1016 & ptrar, ncmpa, itemp, parent)
1019 IF (keep(60) .NE. 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 IF ( ierr .GT. 0 )
THEN
1039 IF (
present(sizeofblocks))
THEN
1041 & (n, parent, iwl1, ikeep1(1), ikeep2(1), ikeep3(1),
1042 & nfsiz(1), ptrar, info(6), fils(1), frere(1),
1043 & ptrar(1,3), nemin, wtemp, keep(60),
1044 & keep(20),keep(38),ptrar(1,2),keep(104),iw(1),keep(50),
1045 & icntl(13), keep(37), keep(197), nslaves, keep(250).EQ.1
1046 & , .true. , sizeofblocks, n
1050 & (n, parent, iwl1, ikeep1(1), ikeep2(1), ikeep3(1),
1051 & nfsiz(1), ptrar, info(6), fils(1), frere(1),
1052 & ptrar(1,3), nemin, wtemp, keep(60),
1053 & keep(20),keep(38),ptrar(1,2),keep(104),iw(1),keep(50),
1054 & icntl(13), keep(37), keep(197), nslaves, keep(250).EQ.1
1055 & , .false., idummy, lidummy )
1059 IF (keep(60).NE.0)
THEN
1060 IF (keep(60)==1)
THEN
1069 IF (keep(60)==1)
THEN
1075 fils(in) = listvar_schur(i)
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 IF ( keep(53) .NE. 0 )
THEN
1091 IF ( (keep(48) == 4 .AND. keep8(21).GT.0_8)
1093 & (keep(48)==5 .AND. keep8(21) .GT. 0_8 )
1095 & (keep(24).NE.0.AND.keep8(21).GT.0_8) )
THEN
1097 & keep(48), keep(50), nslaves)
1099 IF (keep(210).LT.0.OR.keep(210).GT.2)
THEN
1102 IF (keep(210).EQ.0.AND.keep(201).GT.0)
THEN
1105 IF (keep(210).EQ.0.AND.keep(201).EQ.0)
THEN
1108 IF (keep(210).EQ.2)
THEN
1109 keep8(79)=huge(keep8(79))
1111 IF (keep(210).EQ.1.AND.keep8(79).LE.0_8)
THEN
1112 keep8(79)=k79ref * int(nslaves,8)
1114 IF ( (keep(79).EQ.0).OR.(keep(79).EQ.2).OR.
1115 & (keep(79).EQ.3).OR.(keep(79).EQ.5).OR.
1118 IF (keep(210).EQ.1)
THEN
1120 IF ( keep(62).GE.1)
THEN
1122 IF (
present(sizeofblocks))
THEN
1124 iwl1(i) = sizeofblocks(i)
1128 & iwl1(1), n, info(6),
1129 & nslaves, keep,keep8, splitroot,
1130 & mp, ldiag, info(1), info(2))
1131 IF (info(1).LT.0)
GOTO 90
1133 WRITE(mp,*)
" Number of split nodes in pre-splitting=",
1139 splitroot = ((icntl(13).GT.0 .AND. nslaves.GT.icntl(13)) .OR.
1141 IF (keep(53) .NE. 0)
THEN
1144 splitroot = (splitroot.AND.( (keep(60).EQ.0) ))
1147 IF (
present(sizeofblocks))
THEN
1149 iwl1(i) = sizeofblocks(i)
1153 & iwl1(1), n, info(6),
1154 & nslaves, keep,keep8, splitroot,
1155 & mp, ldiag, info(1), info(2))
1156 IF (info(1).LT.0)
GOTO 90
1157 IF ( keep(53) .NE. 0 )
THEN
1162 IF (ldiag.GT.2 .AND. mp.GT.0)
THEN
1164 IF (ldiag.EQ.4) k = n
1165 IF (k.GT.0)
WRITE (mp,99987) (nfsiz(i),i=1,k)
1166 IF (k.GT.0)
WRITE (mp,99989) (fils(i),i=1,k)
1167 IF (k.GT.0)
WRITE (mp,99988) (frere(i),i=1,k)
1171 IF (info(1) .NE. 0)
THEN
1172 IF ((lp.GT.0).AND.(icntl(4).GE.1))
1173 &
WRITE (lp,99996) info(1), info(2)
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))
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 DOUBLE PRECISION,
POINTER,
DIMENSION(:) ::
1279 DOUBLE PRECISION,
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 DOUBLE PRECISION,
ALLOCATABLE,
DIMENSION(:) :: S2
1291 INTEGER ICNTL64(10), INFO64(10)
1292 INTEGER ICNTL_SYM_MWM(10),INFO_SYM_MWM(10)
1293 DOUBLE PRECISION CNTL64(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 DOUBLE PRECISION THEMIN, THEMAX, COLNORM,MAXDBL, ABSAK
1313 DOUBLE PRECISION ZERO,TWO,ONE
1314 parameter(zero = 0.0d0,two = 2.0d0,one = 1.0d0)
1319 prok = ((mprint.GT.0).AND.(icntl(4).GE.2))
1321 scalingloc = .false.
1322 IF(keep(52) .EQ. -2)
THEN
1323 IF(.not.
associated(ida))
THEN
1327 ELSE IF(keep(52) .EQ. 77)
THEN
1329 IF( mtrans .NE. 5 .AND. mtrans .NE. 6
1330 & .AND. mtrans .NE. 7)
THEN
1331 scalingloc = .false.
1333 IF(.not.
associated(ida))
THEN
1334 scalingloc = .false.
1336 &
WRITE(mprint,*)
'Analysis: auto scaling OFF because ',
1337 &
'A not provided at analysis '
1340 IF ( (keep(50).EQ.2).AND.(icntl(8).NE.-2).AND.
1341 & (mtrans .EQ. 7 .OR. keep(95) .EQ. 0) )
THEN
1342 zerodiag => ikeepalloc(1:n)
1350 IF ( (j.LE.n).AND.(j.GE.1) )
THEN
1351 IF(zerodiag(i) .EQ. 0)
THEN
1353 IF(
associated(ida))
THEN
1355 IF(absak .EQ. dble(0.0d0))
THEN
1356 rz_diag = rz_diag + 1
1359 nzer_diag = nzer_diag - 1
1363 IF( (nzer_diag+rz_diag) .LT. (n/10) )
THEN
1370 IF (prok)
WRITE(mprint,*)
1371 &
'Scaling will be computed during analysis'
1373 IF( mtrans.NE.0 .AND. (.NOT.
associated(ida)) ) mtrans=1
1375 IF (mtrans.LT.0 .OR. mtrans.GT.7)
GO TO 500
1376 IF (k50 .EQ. 0)
THEN
1377 IF(.NOT. scalingloc .AND. mtrans .EQ. 7)
THEN
1381 IF (mtransloc.NE.6)
THEN
1386 IF (mtrans .EQ. 7) mtransloc = 5
1388 IF(scalingloc .AND. mtransloc .NE. 5 .AND.
1389 & mtransloc .NE. 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)
1406 icntl64(1) = icntl(1)
1407 icntl64(2) = icntl(2)
1408 icntl64(3) = icntl(3)
1410 IF (icntl(4).EQ.3) icntl64(4) = 0
1411 IF (icntl(4).EQ.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 IF (mtransloc.EQ.5 .OR. mtransloc.EQ.6)
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 IF (mtransloc.EQ.1) liwmin = 5_8*n8
1438 IF (mtransloc.EQ.2) liwmin = 3_8*n8
1439 IF (mtransloc.EQ.3) liwmin = 10_8*n8 + nztot
1440 IF (mtransloc.EQ.4) liwmin = 2_8*n8
1441 IF (mtransloc.EQ.5) liwmin = 5_8*n8
1442 IF (mtransloc.EQ.6) liwmin = 5_8*n8 + nztot
1445 ALLOCATE(iw(liwg), stat=allocok)
1446 IF (allocok .GT. 0 )
THEN
1449 ALLOCATE( ipq8(n), ipe(n+1), stat = allocok )
1450 IF ( allocok .GT. 0 )
THEN
1452 info( 2 ) = (2*n+1)*keep(10)
1455 IF (mtransloc.EQ.1)
THEN
1458 IF (mtransloc.EQ.2) ldwmin =
max( n8+nztot , n8+3_8 )
1459 IF (mtransloc.EQ.3) ldwmin =
max( nztot+1_8 , n8+3_8 )
1460 IF (mtransloc.EQ.4) ldwmin = 2_8 * n8 +
1461 &
max( nztot , n8+3_8 )
1462 IF (mtransloc.EQ.5) ldwmin = 3_8*n8 + nztot
1463 IF (mtransloc.EQ.6) ldwmin = 4_8*n8 + nztot
1465 ALLOCATE(s2(ldw), stat=allocok)
1466 IF (allocok .GT. 0 )
THEN
1469 IF(mtransloc .NE. 1) ldw = ldw-nztot
1480 IF ( (j.LE.n).AND.(j.GE.1).AND.
1481 & (i.LE.n).AND.(i.GE.1) )
THEN
1482 ipq8(j) = ipq8(j) + 1_8
1483 nzreal = nzreal + 1_8
1493 IF ( (j.LE.n).AND.(j.GE.1).AND.
1494 & (i.LE.n).AND.(i.GE.1) )
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 IF (zerodiag(i) .EQ. 0)
THEN
1503 IF(
associated(ida))
THEN
1505 IF(absak .EQ. dble(0.0d0))
THEN
1506 rz_diag = rz_diag + 1
1508 zerodiag(i) = exponent(absak)
1509 if ( zerodiag(i).EQ.0) zerodiag(i)=1
1511 nzer_diag = nzer_diag - 1
1513 IF(
associated(ida))
THEN
1515 zerodiag(i) = zerodiag(i)+ exponent(absak)
1516 if ( zerodiag(i).EQ.0) zerodiag(i)=1
1522 IF(mtransloc .GE. 4)
THEN
1524 IF(zerodiag(i) .EQ. 0)
THEN
1525 ipq8(i) = ipq8(i) + 1_8
1526 nzreal = nzreal + 1_8
1533 ipe(j+1) = ipe(j)+ipq8(j)
1539 IF (mtransloc.EQ.1)
THEN
1543 IF ( (j.LE.n).AND.(j.GE.1) .AND.
1544 & (i.LE.n).AND.(i.GE.1))
THEN
1546 iw(irnw+kpos-1_8) = i
1547 ipq8(j) = ipq8(j) + 1_8
1551 IF ( .not.
associated(ida))
THEN
1559 IF ( (j.LE.n).AND.(j.GE.1) .AND.
1560 & (i.LE.n).AND.(i.GE.1))
THEN
1563 s2(kpos) = abs(ida(k))
1564 ipq8(j) = ipq8(j) + 1_8
1569 IF (mtransloc.EQ.1)
THEN
1573 IF ( (j.LE.n).AND.(j.GE.1) .AND.
1574 & (i.LE.n).AND.(i.GE.1))
THEN
1577 ipq8(j) = ipq8(j) + 1_8
1581 ipq8(i) = ipq8(i) + 1_8
1586 IF ( .not.
associated(ida) )
THEN
1592 themin = huge(themin)
1596 IF ( (j.LE.n).AND.(j.GE.1) .AND.
1597 & (i.LE.n).AND.(i.GE.1))
THEN
1599 iw(irnw+kpos-1_8) = i
1600 s2(kpos) = abs(ida(k))
1601 ipq8(j) = ipq8(j) + 1_8
1602 IF(abs(ida(k)) .GT. themax)
THEN
1603 themax = abs(ida(k))
1604 ELSE IF(abs(ida(k)) .LT. themin
1605 & .AND. abs(ida(k)).GT. zero)
THEN
1606 themin = abs(ida(k))
1611 s2(kpos) = abs(ida(k))
1612 ipq8(i) = ipq8(i) + 1_8
1617 IF(zerodiag(i) .EQ. 0)
THEN
1621 ipq8(i) = ipq8(i) + 1_8
1624 IF ( themax .NE. zero )
THEN
1625 cntl64(2) = (log(themax/themin))*(dble(n))
1626 & - log(themin) + one
1632 flag => ikeepalloc(2*n+1:3*n)
1633 IF(mtransloc.NE.1)
THEN
1640 IF(nzreal .NE. nzsave) duppli = .true.
1642 IF ( mtransloc .EQ. 1 )
THEN
1647 & ipe, iw(irnw), s2(1), ls2,
1648 & numnz, perm(1), liw, iw(ipiw), ldw, s2(ls2+1),
1650 & icntl64, cntl64, info64, info)
1651 IF (info(1).LT.0)
THEN
1652 IF (lp.GT.0 .AND. icntl(4).GE.1)
1653 &
WRITE(lp,
'(A,I5)')
1654 &
' Not enough memory in MAXTRANS INFO(1)=',info(1)
1657 IF (info64(1).LT.0)
THEN
1658 IF (lp.GT.0 .AND. icntl(4).GE.1)
1659 &
WRITE(lp,
'(A,I5)')
1660 &
' INTERNAL ERROR in MAXTRANS INFO(1)=',info64(1)
1665 IF (info64(1).GT.0)
THEN
1666 IF (mp.GT.0 .AND. icntl(4).GE.2)
1667 &
WRITE(mp,
'(A,I5)')
1668 &
' WARNING in MAXTRANS INFO(1)=',info64(1)
1673 IF(zerodiag(i) .EQ. 0)
THEN
1674 IF(perm(i) .EQ. i)
THEN
1675 ker_size = ker_size + 1
1677 str_ker(ker_size) = i
1682 IF (numnz.LT.n)
GO TO 400
1685 IF (mtrans .EQ. 0 )
GOTO 102
1688 iw(irnw+int(jperm-1,8)) = j
1689 IF (jperm.NE.j) ident = .false.
1694 IF(mtrans .EQ. 7)
THEN
1698 IF (prok)
WRITE(mprint,
'(A)')
1699 &
' ... Apply column permutation'
1702 IF ((j.LE.0).OR.(j.GT.n))
GO TO 100
1703 idjcn(k) = iw(irnw+int(j-1,8))
1705 IF (mp.GT.0 .AND. icntl(4).GE.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 IF (allocok .GT.0)
THEN
1719 IF ((lp.GE.0).AND.(icntl(4).GE.1))
THEN
1720 WRITE (lp,
'(/A)')
'** Error in DMUMPS_ANA_O'
1722 &
'** Failure during allocation of COLSCA'
1726 ALLOCATE( idrowsca(n), stat=allocok)
1727 IF (allocok .GT.0)
THEN
1730 IF ((lp.GE.0).AND.(icntl(4).GE.1))
THEN
1731 WRITE (lp,
'(/A)')
'** Error in DMUMPS_ANA_O'
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 DMUMPS_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,'(/A)
') '** Error in DMUMPS_ANA_O
'
1916 WRITE (LP,'(A)
') '** Failure during allocation of 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)
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)
3620 DOUBLE PRECISION :: A(LA)
3621 DOUBLE PRECISION :: DW(LDW),CNTL(NCNTL)
3622 INTEGER(8),
DIMENSION(:),
ALLOCATABLE :: IWtemp8
3624 INTEGER :: I,J,WARN1,WARN2,WARN4
3626 DOUBLE PRECISION :: FACT,ZERO,ONE,RINF,RINF2,RINF3
3627 parameter(zero=0.0d+00,one=1.0d+0)
3632 rinf2 = huge(rinf2)/dble(2*n)
3637 IF (job.LT.1 .OR. job.GT.6)
THEN
3640 IF (icntl(1).GE.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(1),9001) info(1),
'M',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(4*n + m,8)
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)
3749 fact =
max(zero,cntl(1))
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.0d0/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.0d0)
THEN
3884 dw(i) = dw(i) + log(dw(2*m+n+i))
3890 IF (dw(2*m+j).NE.zero)
THEN
3891 dw(m+j) = dw(m+j) - log(dw(2*m+j))
3897 fact = 0.5d0*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 DMUMPS_MTRANSA. INFO(1) = ',i2,
3944 &
' because ',(a),
' = ',i14)
3945 9004
FORMAT (
' ****** Error in DMUMPS_MTRANSA. INFO(1) = ',i2/
3946 &
' LIW too small, must be at least ',i14)
3947 9005
FORMAT (
' ****** Error in DMUMPS_MTRANSA. INFO(1) = ',i2/
3948 &
' LDW too small, must be at least ',i14)
3949 9006
FORMAT (
' ****** Error in DMUMPS_MTRANSA. INFO(1) = ',i2/
3951 &
' contains an entry with invalid row index ',i8)
3952 9007
FORMAT (
' ****** Error in DMUMPS_MTRANSA. INFO(1) = ',i2/
3954 &
' contains two or more entries with row index ',i8)
3955 9010
FORMAT (
' ****** Warning from DMUMPS_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 DMUMPS_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 DMUMPS_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)))