25 integer(kind=kint),
intent(in):: neqns
26 integer(kind=kint),
intent(in):: nttbr
27 integer(kind=kint),
intent(in):: adj0(:)
28 integer(kind=kint),
intent(in):: xadj(:)
29 integer(kind=kint),
intent(out):: perm(:)
30 integer(kind=kint),
intent(out):: invp(:)
32 integer(kind=kint),
allocatable:: deg(:)
33 integer(kind=kint),
allocatable:: marker(:)
34 integer(kind=kint),
allocatable:: rchset(:)
35 integer(kind=kint),
allocatable:: nbrhd(:)
36 integer(kind=kint),
allocatable:: qsize(:)
37 integer(kind=kint),
allocatable:: qlink(:)
38 integer(kind=kint),
allocatable:: adjncy(:)
39 integer(kind=kint):: inode
40 integer(kind=kint):: ip
41 integer(kind=kint):: irch
42 integer(kind=kint):: j
43 integer(kind=kint):: mindeg
44 integer(kind=kint):: ndeg
45 integer(kind=kint):: nhdsze
46 integer(kind=kint):: node
47 integer(kind=kint):: np
48 integer(kind=kint):: num
49 integer(kind=kint):: nump1
50 integer(kind=kint):: nxnode
51 integer(kind=kint):: rchsze
52 integer(kind=kint):: search
53 integer(kind=kint):: thresh
54 integer(kind=kint):: ierror
57 allocate (deg(neqns+1),stat=ierror)
58 if ( ierror/=0 ) stop
"ALLOCATION ERROR, deg: SUB. genqmd"
59 allocate (marker(neqns+1),stat=ierror)
60 if ( ierror/=0 ) stop
"ALLOCATION ERROR, marker: SUB. genqmd"
61 allocate (rchset(neqns+2),stat=ierror)
62 if ( ierror/=0 ) stop
"ALLOCATION ERROR, rchset: SUB. genqmd"
63 allocate (nbrhd(neqns+1),stat=ierror)
64 if ( ierror/=0 ) stop
"ALLOCATION ERROR, nbrhd: SUB. genqmd"
65 allocate (qsize(neqns+1),stat=ierror)
66 if ( ierror/=0 ) stop
"ALLOCATION ERROR, qsize: SUB. genqmd"
67 allocate (qlink(neqns+1),stat=ierror)
68 if ( ierror/=0 ) stop
"ALLOCATION ERROR, qlink: SUB. genqmd"
69 allocate (adjncy(2*nttbr),stat=ierror)
70 if ( ierror/=0 ) stop
"ALLOCATION ERROR, adjncy: SUB. genqmd"
73 adjncy(1:xadj(neqns+1) - 1) = adj0(1:xadj(neqns+1) - 1)
80 ndeg = xadj(node+1) - xadj(node)
82 if ( ndeg<mindeg ) mindeg = ndeg
92 if ( nump1>search ) search = nump1
96 if ( marker(node)>=0 )
then
98 if ( ndeg<=thresh )
then
102 if ( ndeg<mindeg ) mindeg = ndeg
105 if (.not. found) cycle loop1
109 call qmdrch(node,xadj,adjncy,deg,marker,rchsze,rchset,nhdsze,nbrhd)
120 nxnode = qlink(nxnode)
121 if ( nxnode<=0 )
then
123 call qmdupd(xadj,adjncy,rchsze,rchset,deg,qsize,qlink,marker,rchset(rchsze+1:),nbrhd(nhdsze+1:))
127 if ( marker(inode)>=0 )
then
130 if ( ndeg<mindeg ) mindeg = ndeg
131 if ( ndeg<=thresh )
then
138 if ( nhdsze>0 )
call qmdot(node,xadj,adjncy,marker,rchsze,rchset,nbrhd)
140 if ( num>=neqns )
exit
161 subroutine qmdrch(Root,Xadj,Adjncy,Deg,Marker,Rchsze,Rchset,Nhdsze,Nbrhd)
164 integer(kind=kint),
intent(in):: root
165 integer(kind=kint),
intent(in):: adjncy(:)
166 integer(kind=kint),
intent(in):: deg(:)
167 integer(kind=kint),
intent(in):: xadj(:)
168 integer(kind=kint),
intent(out):: nhdsze
169 integer(kind=kint),
intent(out):: rchsze
170 integer(kind=kint),
intent(inout):: marker(:)
171 integer(kind=kint),
intent(out):: rchset(:)
172 integer(kind=kint),
intent(out):: nbrhd(:)
174 integer(kind=kint):: i
175 integer(kind=kint):: istrt
176 integer(kind=kint):: istop
177 integer(kind=kint):: j
178 integer(kind=kint):: jstrt
179 integer(kind=kint):: jstop
180 integer(kind=kint):: nabor
181 integer(kind=kint):: node
186 istop = xadj(root+1) - 1
187 if ( istop<istrt )
return
190 if ( nabor==0 )
return
191 if ( marker(nabor)==0 )
then
192 if ( deg(nabor)<0 )
then
195 nbrhd(nhdsze) = nabor
198 jstop = xadj(nabor+1) - 1
202 if ( node<0 ) cycle loop1
204 if ( marker(node)==0 )
then
206 rchset(rchsze) = node
214 rchset(rchsze) = nabor
219 end subroutine qmdrch
224 subroutine qmdupd(Xadj,Adjncy,Nlist,List,Deg,Qsize,Qlink,Marker,Rchset,Nbrhd)
227 integer(kind=kint),
intent(in):: nlist
228 integer(kind=kint),
intent(in):: adjncy(:)
229 integer(kind=kint),
intent(in):: list(:)
230 integer(kind=kint),
intent(in):: xadj(:)
231 integer(kind=kint),
intent(inout):: deg(:)
232 integer(kind=kint),
intent(inout):: marker(:)
233 integer(kind=kint),
intent(out):: rchset(:)
234 integer(kind=kint),
intent(out):: nbrhd(:)
235 integer(kind=kint),
intent(inout):: qsize(:)
236 integer(kind=kint),
intent(inout):: qlink(:)
238 integer(kind=kint):: deg0
239 integer(kind=kint):: deg1
240 integer(kind=kint):: il
241 integer(kind=kint):: inhd
242 integer(kind=kint):: inode
243 integer(kind=kint):: irch
244 integer(kind=kint):: j
245 integer(kind=kint):: jstrt
246 integer(kind=kint):: jstop
247 integer(kind=kint):: mark
248 integer(kind=kint):: nabor
249 integer(kind=kint):: nhdsze
250 integer(kind=kint):: node
251 integer(kind=kint):: rchsze
253 if ( nlist<=0 )
return
258 deg0 = deg0 + qsize(node)
260 jstop = xadj(node+1) - 1
263 if ( marker(nabor)==0 .and. deg(nabor)<0 )
then
266 nbrhd(nhdsze) = nabor
271 if ( nhdsze>0 )
call qmdmrg(xadj,adjncy,deg,qsize,qlink,marker,deg0,nhdsze,nbrhd,rchset,nbrhd(nhdsze+1:))
275 if ( mark<=1 .and. mark>=0 )
then
276 call qmdrch(node,xadj,adjncy,deg,marker,rchsze,rchset,nhdsze,nbrhd)
281 deg1 = deg1 + qsize(inode)
294 end subroutine qmdupd
299 subroutine qmdmrg(Xadj,Adjncy,Deg,Qsize,Qlink,Marker,Deg0,Nhdsze,Nbrhd,Rchset,Ovrlp)
302 integer(kind=kint),
intent(in):: deg0
303 integer(kind=kint),
intent(in):: nhdsze
304 integer(kind=kint),
intent(in):: adjncy(:)
305 integer(kind=kint),
intent(in):: nbrhd(:)
306 integer(kind=kint),
intent(in):: xadj(:)
307 integer(kind=kint),
intent(inout):: deg(:)
308 integer(kind=kint),
intent(inout):: qsize(:)
309 integer(kind=kint),
intent(inout):: qlink(:)
310 integer(kind=kint),
intent(inout):: marker(:)
311 integer(kind=kint),
intent(out):: rchset(:)
312 integer(kind=kint),
intent(out):: ovrlp(:)
314 integer(kind=kint):: deg1
315 integer(kind=kint):: head
316 integer(kind=kint):: inhd
317 integer(kind=kint):: iov
318 integer(kind=kint):: irch
319 integer(kind=kint):: j
320 integer(kind=kint):: jstrt
321 integer(kind=kint):: jstop
322 integer(kind=kint):: link
323 integer(kind=kint):: lnode
324 integer(kind=kint):: mark
325 integer(kind=kint):: mrgsze
326 integer(kind=kint):: nabor
327 integer(kind=kint):: node
328 integer(kind=kint):: novrlp
329 integer(kind=kint):: rchsze
330 integer(kind=kint):: root
332 if ( nhdsze<=0 )
return
345 jstop = xadj(root+1) - 1
349 if ( nabor<0 ) cycle loop1
356 rchset(rchsze) = nabor
357 deg1 = deg1 + qsize(nabor)
359 elseif ( mark<=1 )
then
361 ovrlp(novrlp) = nabor
370 loop2:
do iov = 1, novrlp
373 jstop = xadj(node+1) - 1
376 if ( marker(nabor)==0 )
then
381 mrgsze = mrgsze + qsize(node)
397 deg(head) = deg0 + deg1 - 1
409 end subroutine qmdmrg
414 subroutine qmdot(Root,Xadj,Adjncy,Marker,Rchsze,Rchset,Nbrhd)
417 integer(kind=kint),
intent(in):: rchsze
418 integer(kind=kint),
intent(in):: root
419 integer(kind=kint),
intent(in):: marker(:)
420 integer(kind=kint),
intent(in):: rchset(:)
421 integer(kind=kint),
intent(in):: nbrhd(:)
422 integer(kind=kint),
intent(in):: xadj(:)
423 integer(kind=kint),
intent(inout):: adjncy(:)
425 integer(kind=kint):: inhd
426 integer(kind=kint):: irch
427 integer(kind=kint):: j
428 integer(kind=kint):: jstrt
429 integer(kind=kint):: jstop
430 integer(kind=kint):: link
431 integer(kind=kint):: nabor
432 integer(kind=kint):: node
439 jstop = xadj(node+1) - 2
440 if ( jstop>=jstrt )
then
443 adjncy(j) = rchset(irch)
444 if ( irch>=rchsze )
exit loop1
447 link = adjncy(jstop+1)
452 adjncy(jstop+1) = -node
459 if ( marker(node)>=0 )
then
461 jstop = xadj(node+1) - 1
464 if ( marker(nabor)<0 )
then