subroutine mdm
* (vk,tail, v,l, last,next, mark)
c***********************************************************************
c mdm -- form element from uneliminated neighbors of vk
c***********************************************************************
integer vk, tail, v(*), l(*), last(*), next(*), mark(*),
* tag, s,ls,vs,es, b,lb,vb, blp,blpmax
equivalence (vs, es)
c
c----initialize tag and list of uneliminated neighbors
tag = mark(vk)
tail = vk
c
c----for each vertex/element vs/es in element list of vk
ls = l(vk)
1 s = ls
if (s.eq.0) go to 5
ls = l(s)
vs = v(s)
if (next(vs).lt.0) go to 2
c
c------if vs is uneliminated vertex, then tag and append to list of
c------uneliminated neighbors
mark(vs) = tag
l(tail) = s
tail = s
go to 4
c
c------if es is active element, then ...
c--------for each vertex vb in boundary list of element es
2 lb = l(es)
blpmax = last(es)
do 3 blp=1,blpmax
b = lb
lb = l(b)
vb = v(b)
c
c----------if vb is untagged vertex, then tag and append to list of
c----------uneliminated neighbors
if (mark(vb).ge.tag) go to 3
mark(vb) = tag
l(tail) = b
tail = b
3 continue
c
c--------mark es inactive
mark(es) = tag
c
4 go to 1
c
c----terminate list of uneliminated neighbors
5 l(tail) = 0
c
return
end