subroutine mdi
* (n, ia,ja, max,v,l, head,last,next, mark,tag, flag)
c***********************************************************************
c mdi -- initialization
c***********************************************************************
integer ia(*), ja(*), v(*), l(*), head(*), last(*), next(*),
* mark(*), tag, flag, sfs, vi,dvi, vj
c
c----initialize degrees, element lists, and degree lists
do 1 vi=1,n
mark(vi) = 1
l(vi) = 0
1 head(vi) = 0
sfs = n+1
c
c----create nonzero structure
c----for each nonzero entry a(vi,vj)
do 6 vi=1,n
jmin = ia(vi)
jmax = ia(vi+1) - 1
if (jmin.gt.jmax) go to 6
do 5 j=jmin,jmax
vj = ja(j)
if (vj-vi) 2, 5, 4
c
c------if a(vi,vj) is in strict lower triangle
c------check for previous occurrence of a(vj,vi)
2 lvk = vi
kmax = mark(vi) - 1
if (kmax .eq. 0) go to 4
do 3 k=1,kmax
lvk = l(lvk)
if (v(lvk).eq.vj) go to 5
3 continue
c----for unentered entries a(vi,vj)
4 if (sfs.ge.max) go to 101
c
c------enter vj in element list for vi
mark(vi) = mark(vi) + 1
v(sfs) = vj
l(sfs) = l(vi)
l(vi) = sfs
sfs = sfs+1
c
c------enter vi in element list for vj
mark(vj) = mark(vj) + 1
v(sfs) = vi
l(sfs) = l(vj)
l(vj) = sfs
sfs = sfs+1
5 continue
6 continue
c
c----create degree lists and initialize mark vector
do 7 vi=1,n
dvi = mark(vi)
next(vi) = head(dvi)
head(dvi) = vi
last(vi) = -dvi
nextvi = next(vi)
if (nextvi.gt.0) last(nextvi) = vi
7 mark(vi) = tag
c
return
c
c ** error- insufficient storage
101 flag = 9*n + vi
return
end