1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
SUBROUTINE SPCHO1 (NEQNS,A,NNZA,INDA,XADJF,PERM,INVP,
& colcnt,snode,nnzl,nsub,nsuper,xsuper,
& iwork,xadj,adjncy,indlnz,lnz,diag,ierr)
C
C -----------
C PARAMETERS.
C -----------
C
INTEGER IWSIZ,NEQNS,NNZA, NSUPER,iflag
INTEGER I,I0,nnzb,nnzc,nnzl,nsub
C
INTEGER ADJNCY(NNZA), COLCNT(NEQNS) ,SNODE(NEQNS)
INTEGER INVP(NEQNS) , IWORK(7*NEQNS+3),PERM(NEQNS)
INTEGER XADJ(NEQNS+1),XSUPER(NEQNS+1),xadjf(neqns+1)
INTEGER INDA(NNZA+NEQNS),indlnz(nnza+neqns)
DOUBLE PRECISION A(NNZA),LNZ(NNZA),diag(neqns)
c
iwsiz=7*neqns+3
xadjf(1)=1
do 100 i=2,neqns
100 xadjf(i)=xadjf(i-1)+inda(i-1)
xadjf(neqns+1)=nnza+1
c
call dspt(neqns,neqns,a,nnza,inda,xadjf,lnz,iwork,indlnz)
ierr=5
do 107 i=1,nnza
if (a(i) .ne. lnz(i) ) then
ierr=1
return
endif
107 continue
do 108 i=1,neqns
if (xadjf(i) .ne. iwork(i)) then
ierr=1
return
endif
108 continue
c
c A -DIAG(A)
c
i0=0
i1=i0
i=1
ierr=0
idiag0=0
nnzc=nnza-neqns
if (inda(neqns+1) .ne. 1 .or. inda(neqns+nnza) .ne. neqns
& .or. inda(neqns).eq. 0 ) then
ierr=1
return
endif
do 10 k=1,nnza
08 i0=i0+1
if(i0-i1.gt.inda(i)) then
i1=i0
i=i+1
goto 08
endif
j=inda(neqns+k)
if (i .eq. j) then
if (idiag0+1 .ne. i) then
ierr=1
return
endif
idiag0=i
diag(i)=-a(k)
endif
10 continue
c
do 200 i=1,neqns
iwork(i)=1
200 iwork(i+neqns)=i
call dspasp(neqns,neqns,a,nnza,inda,
& diag,neqns,iwork,lnz,nnzc,indlnz,ierr)
xadj(1)=1
do 210 i=2,neqns
210 xadj(i)=xadj(i-1)+indlnz(i-1)
xadj(neqns+1)=nnzc+1
DO 310 i=1,nnzc
310 adjncy(i)=indlnz(neqns+i)
C***********************************************************************
C PURPOSE - THIS ROUTINE CALLS LIU'S MULTIPLE MINIMUM DEGREE ROUTINE.
C***********************************************************************
C
CALL ORDMMD ( NEQNS , XADJ , adjncy, INVP ,PERM,
1 IWSIZ , IWORK , NSUB, IFLAG )
C***********************************************************************
C PURPOSE:
C THIS SUBROUTINE COMPUTES THE STORAGE REQUIREMENTS AND SETS UP
C PRELIMINARY DATA STRUCTURES FOR THE SYMBOLIC FACTORIZATION.
C CAUTION: THE ADJACENCY VECTOR ADJNCY WILL BE DESTROYED
DO 410 i=1,nnza-neqns
410 adjncy(i)=indlnz(neqns+i)
C
C NOTE:
C THIS VERSION PRODUCES THE MAXIMAL SUPERNODE PARTITION (I.E.,
C THE ONE WITH THE FEWEST POSSIBLE SUPERNODES).
C
CALL SFINIT(NEQNS , NNZc , XADJ , ADJNCY, PERM ,
& INVP , COLCNT, NNZL , NSUB , NSUPER,
& SNODE , XSUPER, IWSIZ , IWORK , IFLAG )
return
end
c-------------------------------------------------------------------
|