Actual source code: qmdupd.c
1: /*$Id: qmdupd.c,v 1.19 2001/03/23 23:22:51 balay Exp $*/
2: /* qmdupd.f -- translated by f2c (version 19931217).*/
4: #include petsc.h
6: /******************************************************************/
7: /*********** QMDUPD ..... QUOT MIN DEG UPDATE ************/
8: /******************************************************************/
9: /******************************************************************/
11: /* PURPOSE - THIS ROUTINE PERFORMS DEGREE UPDATE FOR A SET*/
12: /* OF NODES IN THE MINIMUM DEGREE ALGORITHM.*/
14: /* INPUT PARAMETERS -*/
15: /* (XADJ, ADJNCY) - THE ADJACENCY STRUCTURE.*/
16: /* (NLIST, LIST) - THE LIST OF NODES WHOSE DEGREE HAS TO*/
17: /* BE UPDATED.*/
19: /* UPDATED PARAMETERS -*/
20: /* DEG - THE DEGREE VECTOR.*/
21: /* QSIZE - SIZE OF INDISTINGUISHABLE SUPERNODES.*/
22: /* QLINK - LINKED LIST FOR INDISTINGUISHABLE NODES.*/
23: /* MARKER - USED TO MARK THOSE NODES IN REACH/NBRHD SETS.*/
25: /* WORKING PARAMETERS -*/
26: /* RCHSET - THE REACHABLE SET.*/
27: /* NBRHD - THE NEIGHBORHOOD SET.*/
29: /* PROGRAM SUBROUTINES -*/
30: /* QMDMRG.*/
31: /******************************************************************/
32: int SPARSEPACKqmdupd(int *xadj, int *adjncy, int *nlist,
33: int *list, int *deg, int *qsize, int *qlink, int *
34: marker, int *rchset, int *nbrhd)
35: {
36: /* System generated locals */
37: int i__1, i__2;
39: /* Local variables */
40: int inhd, irch, node, mark, j, inode, nabor, jstop, jstrt, il;
41: EXTERN int SPARSEPACKqmdrch(int *, int *, int *,
42: int *, int *, int *, int *, int *, int *),
43: SPARSEPACKqmdmrg(int *, int *, int *, int *, int *,
44: int *, int *, int *, int *, int *, int *);
45: int nhdsze, rchsze, deg0, deg1;
47: /* FIND ALL ELIMINATED SUPERNODES THAT ARE ADJACENT*/
48: /* TO SOME NODES IN THE GIVEN LIST. PUT THEM INTO.*/
49: /* (NHDSZE, NBRHD). DEG0 CONTAINS THE NUMBER OF*/
50: /* NODES IN THE LIST.*/
54: /* Parameter adjustments */
55: --nbrhd;
56: --rchset;
57: --marker;
58: --qlink;
59: --qsize;
60: --deg;
61: --list;
62: --adjncy;
63: --xadj;
65: if (*nlist <= 0) {
66: return(0);
67: }
68: deg0 = 0;
69: nhdsze = 0;
70: i__1 = *nlist;
71: for (il = 1; il <= i__1; ++il) {
72: node = list[il];
73: deg0 += qsize[node];
74: jstrt = xadj[node];
75: jstop = xadj[node + 1] - 1;
76: i__2 = jstop;
77: for (j = jstrt; j <= i__2; ++j) {
78: nabor = adjncy[j];
79: if (marker[nabor] != 0 || deg[nabor] >= 0) {
80: goto L100;
81: }
82: marker[nabor] = -1;
83: ++nhdsze;
84: nbrhd[nhdsze] = nabor;
85: L100:
86: ;
87: }
88: }
89: /* MERGE INDISTINGUISHABLE NODES IN THE LIST BY*/
90: /* CALLING THE SUBROUTINE QMDMRG.*/
91: if (nhdsze > 0) {
92: SPARSEPACKqmdmrg(&xadj[1], &adjncy[1], °[1], &qsize[1], &qlink[1], &marker[
93: 1], °0, &nhdsze, &nbrhd[1], &rchset[1], &nbrhd[nhdsze + 1]);
94: }
95: /* FIND THE NEW DEGREES OF THE NODES THAT HAVE NOT BEEN*/
96: /* MERGED.*/
97: i__1 = *nlist;
98: for (il = 1; il <= i__1; ++il) {
99: node = list[il];
100: mark = marker[node];
101: if (mark > 1 || mark < 0) {
102: goto L600;
103: }
104: marker[node] = 2;
105: SPARSEPACKqmdrch(&node, &xadj[1], &adjncy[1], °[1], &marker[1], &rchsze, &
106: rchset[1], &nhdsze, &nbrhd[1]);
107: deg1 = deg0;
108: if (rchsze <= 0) {
109: goto L400;
110: }
111: i__2 = rchsze;
112: for (irch = 1; irch <= i__2; ++irch) {
113: inode = rchset[irch];
114: deg1 += qsize[inode];
115: marker[inode] = 0;
116: }
117: L400:
118: deg[node] = deg1 - 1;
119: if (nhdsze <= 0) {
120: goto L600;
121: }
122: i__2 = nhdsze;
123: for (inhd = 1; inhd <= i__2; ++inhd) {
124: inode = nbrhd[inhd];
125: marker[inode] = 0;
126: }
127: L600:
128: ;
129: }
130: return(0);
131: }