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) ::
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 ::
56 INTEGER,
DIMENSION(:),
ALLOCATABLE,
TARGET ::
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,,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,
111 INTEGER(8) :: LIW8, NZG8
112 DOUBLE PRECISION TIMEB
117 EXTERNAL smumps_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: SMUMPS_ANA_F constrained ordering not '//
326 &
' available with selected ordering. Move to' //
327 &
' compressed ordering.'
334 compress = keep(95) - 1
335 IF(compress .GT. 0 .AND. keep(52) .EQ. -2)
THEN
336 IF(cntl4 .GE. 0.0e0)
THEN
337 IF (keep(1).LE.8)
THEN
344 IF(mtrans .GT. 0 .AND. keep(50) .EQ. 2)
THEN
347 IF (compress .EQ. 2)
THEN
349 WRITE(*,*)
"IORD not compatible with COMPRESS:",
354 & n,piv(1),frere(1),fils(1),nfsiz(1),ikeep1(1),
355 & ncst,keep,keep8, rowsca(1)
358 IF ( iord .NE. 1 )
THEN
359 IF (compress .GE. 1)
THEN
360 ALLOCATE(ipq8(n),stat=ierr)
361 IF ( ierr .GT. 0 )
THEN
363 info( 2 ) = n*keep(10)
366 & n, nz8, irn(1), icn(1), piv(1),
367 & ncmp, iw(1), liw8, ipe(1), ptrar(1,2), ipq8,
368 & iwl1, fils(1), iwfr8,
369 & ierror, keep, keep8, icntl, inplace64_graph_copy)
373 IF ( (symmetry.LT.minsym).AND.(keep(50).EQ.0) )
THEN
374 IF(keep(23) .EQ. 7 )
THEN
377 ELSE IF(keep(23) .EQ. -9876543)
THEN
380 IF (prok)
WRITE(mp,
'(A)')
381 &
' ... Apply column permutation (already computed)'
385 IF (jperm.NE.j) ident = .false.
390 IF ((j.LE.0).OR.(j.GT.n)) cycle
393 ALLOCATE(colsca_temp(n), stat=ierr)
400 colsca_temp(j)=colsca(j)
403 colsca(fils(j))=colsca_temp(j)
405 DEALLOCATE(colsca_temp)
408 &
' WARNING input matrix data modified'
409 ALLOCATE(ipq8(n),stat=ierr)
410 IF ( ierr .GT. 0 )
THEN
412 info( 2 ) = n*keep(10)
415 & (n,nz8,irn(1), icn(1), iw(1), liw8,
416 & ipe(1), ptrar(1,2),
417 & ipq8, iwl1, iwfr8, keep8(126), keep8(127),
418 & info(1), info(2), icntl, symmetry, keep(50),
419 & nbqd, avgdens, keep(264), keep(265),
420 & .true.,inplace64_graph_copy)
428 ELSE IF (keep(23) .EQ. 7 .OR. keep(23) .EQ. -9876543 )
THEN
429 IF (prok)
WRITE(mp,
'(A)')
430 &
' ... No column permutation'
434 IF (free_centralized_matrix
435 & .AND.compress.EQ.0.AND.(.NOT.compress_schur))
THEN
441 inplace64_restore_graph =
442 & inplace64_restore_graph.AND.(compress.NE.1)
443 ALLOCATE( parent( n ), stat = ierr )
444 IF ( ierr .GT. 0 )
THEN
449 IF (iord.NE.1 .AND. iord.NE.5)
THEN
450 IF ( keep(60) .NE. 0 )
THEN
455 WRITE(mp,
'(A)')
' Ordering based on AMF '
456#if defined(scotch) || defined(ptscotch)
457 ELSE IF (iord.EQ.3)
THEN
458 WRITE(mp,
'(A)')
' Ordering based on SCOTCH '
461 ELSE IF (iord.EQ.4)
THEN
462 WRITE(mp,
'(A)')
' Ordering based on PORD '
464 ELSE IF (iord.EQ.6)
THEN
465 WRITE(mp,
'(A)')
' Ordering based on QAMD '
467 WRITE(mp,
'(A)')
' Ordering based on AMD '
473 IF ( keep(60) .NE. 0 )
THEN
474 CALL mumps_hamd(n, liw8, ipe(1), iwfr8, ptrar(1,2), iw(1),
476 & ikeep2(1), ncmpa, fils(1), ikeep3(1),
479 & listvar_schur(1), size_schur)
480 IF (keep(60)==1)
THEN
481 keep(20) = listvar_schur(1)
483 keep(38) = listvar_schur(1)
488 ELSEIF (iord .EQ. 4)
THEN
489 CALL mumps_pord_intsize(pord_int_size)
491 IF ( (compress .EQ. 1)
493 & ( (norig.NE.n).AND.
present(sizeofblocks) )
495 IF (compress .EQ. 1)
THEN
499 DO i=1+keep(93)/2,ncmp
503 & ( (norig.NE.n).AND.
present(sizeofblocks) )
THEN
506 iwl1(i) = sizeofblocks(i)
509 IF (pord_int_size .EQ. 64)
THEN
510 CALL mumps_pordf_wnd_mixedto64(ncmp, iwfr8-1_8,
512 & iwl1, ncmpa, totw, parent,
513 & info(1), lp, lpok, keep(10),
514 & inplace64_graph_copy
516 ELSE IF (pord_int_size .EQ. 32)
THEN
517 CALL mumps_pordf_wnd_mixedto32(ncmp, iwfr8-1_8,
519 & iwl1, ncmpa, totw, parent,
520 & info(1), lp, lpok, keep(10))
523 &
"Internal error in PORD wrappers, PORD_INT_SIZE=",
527 IF ( ncmpa .NE. 0 )
THEN
528 write(6,*)
' Out PORD, NCMPA=', ncmpa
533 IF (info(1) .LT.0)
GOTO 90
534 IF (compress.EQ.1)
THEN
537 & frere(1),ptrar(1,1))
543 IF (pord_int_size.EQ.64)
THEN
544 CALL mumps_pordf_mixedto64(ncmp, iwfr8-1_8, ipe,
546 & iwl1, ncmpa, parent,
547 & info(1), lp, lpok, keep(10),
548 & inplace64_graph_copy
550 ELSE IF (pord_int_size.EQ.32)
THEN
551 CALL mumps_pordf_mixedto32(ncmp, iwfr8-1_8, ipe,
553 & iwl1, ncmpa, parent,
554 & info(1), lp, lpok, keep(10))
557 &
"Internal error in PORD wrappers, PORD_INT_SIZE=",
562 IF ( ncmpa .NE. 0 )
THEN
563 write(6,*)
' Out PORD, NCMPA=', ncmpa
568 IF (info(1) .LT. 0)
GOTO 90
570#if defined(scotch) || defined(ptscotch)
571 ELSEIF (iord .EQ. 3)
THEN
572 CALL mumps_scotch_intsize(scotch_int_size)
573 IF ( (compress .EQ. 1)
575 & ( (norig.NE.n).AND.
present(sizeofblocks) )
578 IF (compress .EQ. 1)
THEN
582 DO i=1+keep(93)/2,ncmp
586 & ( (norig.NE.n).AND.
present(sizeofblocks) )
THEN
588 iwl1(i) = sizeofblocks(i)
597 IF (scotch_int_size.EQ.32)
THEN
598 IF (keep(10).EQ.1)
THEN
602 CALL mumps_scotch_mixedto32(ncmp,
605 & ptrar(1,2), iw, iwl1, ikeep1,
606 & ikeep2, ncmpa, info, lp, lpok,
607 & weightused, weightrequested, scotch_symbolic)
609 ELSE IF (scotch_int_size.EQ.64)
THEN
610 CALL mumps_scotch_mixedto64(ncmp,
613 & ptrar(1,2), iw, iwl1, ikeep1,
614 & ikeep2, ncmpa, info, lp, lpok, keep(10),
615 & inplace64_graph_copy,
616 & weightused, weightrequested, scotch_symbolic)
619 &
"Internal error in SCOTCH wrappers, SCOTCH_INT_SIZE=",
623 IF (info(1) .LT. 0)
GOTO 90
624 IF (.NOT. scotch_symbolic)
THEN
625 IF ( compress .EQ. 1 )
THEN
627 & keep(93),piv(1),ikeep1(1),ikeep2(1))
630 ELSE IF ( (compress .EQ. 1)
632 & ( (norig.NE.n).AND.
present(sizeofblocks).AND.
633 & (weightused.EQ.0) )
637 & frere(1),ptrar(1,1))
643 ELSEIF (iord .EQ. 2)
THEN
646 IF(compress .GE. 1)
THEN
651 DO i=1+keep(93)/2,ncmp
654 totel = keep(93)+keep(94)
659 IF (
present(sizeofblocks))
THEN
660 IF (compress.GE.1)
THEN
663 nbbuck =
max(nbbuck, norig-n)
664 nbbuck =
max(nbbuck, 2*norig)
668 iwl1(i) = sizeofblocks(i)
671 ALLOCATE( wtemp( 0: nbbuck + 1), stat = ierr )
672 IF ( ierr .GT. 0 )
THEN
677 IF(compress .LE. 1)
THEN
679 & (totel, ncmp, compute_perm, nbbuck, liw8, ipe(1),
682 & ikeep3(1), ptrar, ptrar(1,3), wtemp, parent(1))
684 IF(prok)
WRITE(mp,
'(A)')
685 &
' Constrained Ordering based on AMF'
688 & iw(1), iwl1, ikeep1(1), ikeep2(1), ncmpa, fils(1),
689 & ikeep3(1), ptrar, ptrar(1,3), wtemp,
690 & nfsiz(1), frere(1), parent(1))
693 ELSEIF (iord .EQ. 6)
THEN
694 ALLOCATE( wtemp( n ), stat = ierr )
695 IF ( ierr .GT. 0 )
THEN
703 IF(compress .EQ. 1)
THEN
708 DO i=1+keep(93)/2,ncmp
711 totel = keep(93)+keep(94)
716 IF (
present(sizeofblocks))
THEN
717 IF (compress.EQ.1)
THEN
723 iwl1(i) = sizeofblocks(i)
727 & (totel,compute_perm,iversion, thresh, wtemp,
728 & ncmp, liw8, ipe(1), iwfr8, ptrar(1,2), iw(1),
729 & iwl1, ikeep1(1), ikeep2(1), ncmpa, fils(1),
730 & ikeep3(1), ptrar, ptrar(1,3), parent(1))
734 IF(compress .EQ. 1)
THEN
739 DO i=1+keep(93)/2,ncmp
742 totel = keep(93)+keep(94)
747 IF (
present(sizeofblocks))
THEN
748 IF (compress.EQ.1)
THEN
754 iwl1(i) = sizeofblocks(i)
758 & ncmp, liw8, ipe(1), iwfr8, ptrar(1,2),
759 & iw(1), iwl1, ikeep1(1), ikeep2(1), ncmpa, fils(1),
760 & ikeep3(1), ptrar, ptrar(1,3), parent(1))
763 IF(compress .GE. 1)
THEN
765 & piv(1),ikeep1(1),ikeep2(1))
770#if defined(scotch) || defined(ptscotch)
772 WRITE( mp,
'(A,F12.4)' )
773 &
' ELAPSED TIME SPENT IN SCOTCH reordering =', timeb
778#if defined(metis) || defined(parmetis) || defined(metis4) || defined(parmetis3)
781 WRITE(mp,
'(A)')
' Ordering based on METIS'
786 CALL mumps_metis_idxsize(metis_idx_size)
787 IF (keep(10).EQ.1.AND.metis_idx_size.NE.64)
THEN
792#if defined(metis4) || defined(parmetis3)
798 IF (compress .EQ. 1)
THEN
802 DO i=keep(93)/2+1,ncmp
805#if defined(metis4) || defined(parmetis3)
806 IF (metis_idx_size .EQ.32)
THEN
807 CALL mumps_metis_nodewnd_mixedto32(
808 & ncmp, ipe, iw, frere,
809 & numflag, metis_options(1), opt_metis_size,
810 & ikeep2, ikeep1, info(1), lp, lpok )
811 ELSE IF (metis_idx_size .EQ.64)
THEN
812 CALL mumps_metis_nodewnd_mixedto64(
813 & ncmp, ipe, iw, frere,
814 & numflag, metis_options(1), opt_metis_size,
815 & ikeep2, ikeep1, info(1), lp, lpok, keep(10),
816 & inplace64_graph_copy )
819 &
"Internal error in METIS wrappers, METIS_IDX_SIZE=",
824 IF ((norig.NE.n).AND.
present(sizeofblocks))
THEN
826 frere(i) = sizeofblocks(i)
828 IF (metis_idx_size .EQ.32)
THEN
829 CALL mumps_metis_nodewnd_mixedto32(
830 & ncmp, ipe, iw, frere,
831 & numflag, metis_options(1), opt_metis_size,
832 & ikeep2, ikeep1, info(1), lp, lpok )
833 ELSE IF (metis_idx_size .EQ.64)
THEN
834 CALL mumps_metis_nodewnd_mixedto64(
835 & ncmp, ipe, iw, frere,
836 & numflag, metis_options(1), opt_metis_size,
837 & ikeep2, ikeep1, info(1), lp, lpok, keep(10),
838 & inplace64_graph_copy )
841 &
"Internal error in METIS wrappers, METIS_IDX_SIZE=",
846 IF (metis_idx_size .EQ.32)
THEN
847 CALL mumps_metis_nodend_mixedto32(
848 & ncmp, ipe, iw, numflag,
849 & metis_options(1), opt_metis_size,
850 & ikeep2, ikeep1, info(1), lp, lpok )
851 ELSE IF (metis_idx_size .EQ.64)
THEN
852 CALL mumps_metis_nodend_mixedto64(
853 & ncmp, ipe, iw, numflag,
854 & metis_options(1), opt_metis_size,
855 & ikeep2, ikeep1, info(1), lp,lpok,keep(10),
856 & liw8, inplace64_graph_copy,
857 & inplace64_restore_graph)
860 &
"Internal error in METIS wrappers, METIS_IDX_SIZE=",
868 IF (
present(sizeofblocks))
THEN
870 frere(i) = sizeofblocks(i)
878 IF (metis_idx_size .EQ. 32)
THEN
879 CALL mumps_metis_nodend_mixedto32
880 & ncmp, ipe, iw, frere,
881 & metis_options(1), opt_metis_size,
882 & ikeep2, ikeep1, info(1), lp, lpok )
883 ELSE IF (metis_idx_size .EQ. 64)
THEN
884 CALL mumps_metis_nodend_mixedto64(
885 & ncmp, ipe, iw, frere,
886 & metis_options(1), opt_metis_size,
887 & ikeep2, ikeep1, info(1), lp,lpok,keep(10),
888 & liw8, inplace64_graph_copy,
889 & inplace64_restore_graph)
891 IF (lpok)
WRITE(lp,*)
892 &
"Internal error in METIS wrappers, METIS_IDX_SIZE=",
897 IF (info(1) .LT.0)
GOTO 90
900 WRITE( mp,
'(A,F12.4)' )
901 &
' ELAPSED TIME SPENT IN METIS reordering =', timeb
903 IF ( compress_schur )
THEN
905 & n, ncmp, ikeep1(1),ikeep2(1),
906 & listvar_schur(1), size_schur, fils(1))
909 IF (compress .EQ. 1)
THEN
911 & keep(93),piv(1),ikeep1(1),ikeep2(1))
918 WRITE(mp,
'(A)')
' Ordering given is used'
921 IF (iord.EQ.1 .OR. iord.EQ.5 .OR. compress.EQ.-1
922 & .OR. ( (iord.EQ.3).AND.(.NOT.scotch_symbolic) )
924 & ( (norig.NE.n).AND.
present(sizeofblocks) .AND.(iord.EQ.3)
925 & .AND. (weightused.EQ.0)
928 IF ((keep(106).EQ.1).OR.(keep(106).EQ.2).OR.(keep(106).EQ.4)
929 & .OR.(keep(60).NE.0))
THEN
930 IF ( compress .EQ. -1 )
THEN
931 ALLOCATE(ipq8(n),stat=ierr)
932 IF ( ierr .GT. 0 )
THEN
934 info( 2 ) = n*keep(10)
937 & ipe(1), ptrar(1,2),
938 & ipq8, iwl1, iwfr8, keep8(126), keep8(127),
939 & info(1), info(2), icntl, symmetry, keep(50),
940 & nbqd, avgdens, keep(264),keep(265), .true.,
941 & inplace64_graph_copy)
945 IF (keep(106).EQ.2)
THEN
947 WRITE(mp,*)
" SYMBOLIC based on column counts "
949 IF (
present(sizeofblocks))
THEN
951 frere(i) = sizeofblocks(i)
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
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 smumps_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 smumps_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
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 REAL,
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 :: (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 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'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. real(0.0e0))
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. real(0.0e0))
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))*(real(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)
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 SMUMPS_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 SMUMPS_ANA_O'
1733 &
'** Failure during allocation of ROWSCA'
1739 maxdbl = log(huge(maxdbl))
1741 IF(s2(rspos+j) .GT. maxdbl)
THEN
1744 IF(s2(cspos+j) .GT. maxdbl)
THEN
1750 idrowsca(j) = exp(s2(rspos+j8))
1751 IF(idrowsca(j) .EQ. zero)
THEN
1754 IF ( mtrans .EQ. -9876543 .OR. mtrans.EQ. 0 )
THEN
1755 idcolsca(j)= exp(s2(cspos+j8))
1756 IF(idcolsca(j) .EQ. zero)
THEN
1760 idcolsca(iw(irnw+j8-1_8))= exp(s2(cspos+j8))
1761 IF(idcolsca(iw(irnw+j8-1_8)) .EQ. 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 IF (allocok .GT.0)
THEN
1776 IF ((lp.GE.0).AND.(icntl(4).GE.1))
THEN
1777 WRITE (lp,
'(/A)')
'** Error in SMUMPS_ANA_O'
1779 &
'** Failure during allocation of COLSCA'
1783 ALLOCATE( idrowsca(n), stat=allocok)
1784 IF (allocok .GT.0)
THEN
1787 IF ((lp.GE.0).AND.(icntl(4).GE.1))
THEN
1788 WRITE (lp,
'(/A)')
'** Error in SMUMPS_ANA_O'
1790 &
'** Failure during allocation of ROWSCA'
1796 maxdbl = log(huge(maxdbl))
1799 IF(s2(rspos+j8)+s2(cspos+j8) .GT. maxdbl)
THEN
1806 IF(perm(j) .GT. 0)
THEN
1808 & exp((s2(rspos+j8)+s2(cspos+j8))/two)
1809 IF(idrowsca(j) .EQ. 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 IF(mtrans .EQ. 7 .OR. keep(95) .EQ. 0)
THEN
1829 IF( (nzer_diag+rz_diag) .LT. (n/10)
1830 & .AND. keep(95) .EQ. 0)
THEN
1835 IF(keep(95) .EQ. 0)
THEN
1842 IF(mtrans .EQ. 7) mtrans = 5
1845 IF(mtrans .EQ. 0)
GOTO 390
1848 IF(mtrans .EQ. 5 .OR. mtrans .EQ. 6 .OR.
1849 & mtrans .EQ. 7)
THEN
1850 icntl_sym_mwm(1) = 0
1851 icntl_sym_mwm(2) = 1
1852 ELSE IF(mtrans .EQ. 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 IF(mtransloc .LT. 4)
THEN
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 IF(info_sym_mwm(1) .NE. 0)
THEN
1873 WRITE(*,*)
'** Error in SMUMPS_ANA_O'
1876 IF(info_sym_mwm(3) .EQ. n)
THEN
1878 ELSEIF ( (icntl(12).EQ.0).AND.
1879 & ( (n-info_sym_mwm(4)-info_sym_mwm(3)) .GT. n/10 )
1885 perm(i) = piv_out(i)
1888 keep(93) = info_sym_mwm(4)
1889 keep(94) = info_sym_mwm(3)
1892 390
IF(mtrans .EQ. 0)
THEN
1895 WRITE (mprint,
'(A)')
1896 &
' ... Column permutation not used'
1900 400
IF ((lp.GE.0).AND.(icntl(4).GE.1))
1901 &
WRITE (lp,
'(/A)')
'** Error: Matrix is structurally singular'
1905 410
IF ((lp.GE.0).AND.(icntl(4).GE.1))
THEN
1906 WRITE (lp,
'(/A)')
'** Error in SMUMPS_ANA_O'
1907 WRITE (lp,
'(A,I14)')
1908 &
'** Failure during allocation of INTEGER array of size ',
1914 430
IF ((lp.GE.0).AND.(icntl(4).GE.1))
THEN
1915 WRITE (lp,
'(/A)')
'** Error in SMUMPS_ANA_O'
1916 WRITE (lp,
'(A)')
'** Failure during allocation of S2'
1921 IF (
allocated(iw))
DEALLOCATE(iw)
1922 IF (
allocated(s2))
DEALLOCATE(s2)
1923 IF (
allocated(ipe))
DEALLOCATE(ipe)
1924 IF (
allocated(ipq8))
DEALLOCATE(ipq8)