Actual source code: rootls.c
1: /*$Id: rootls.c,v 1.15 2001/03/23 23:22:51 balay Exp $*/
2: /* rootls.f -- translated by f2c (version 19931217).*/
4: #include petsc.h
6: /*****************************************************************/
7: /********* ../../..LS ..... ../../..ED LEVEL STRUCTURE **********/
8: /*****************************************************************/
9: /* PURPOSE - ../../..LS GENERATES THE LEVEL STRUCTURE ../../..ED */
10: /* AT THE INPUT NODE CALLED ../../... ONLY THOSE NODES FOR*/
11: /* WHICH MASK IS NONZERO WILL BE CONSIDERED.*/
12: /* */
13: /* INPUT PARAMETERS - */
14: /* ../../.. - THE NODE AT WHICH THE LEVEL STRUCTURE IS TO*/
15: /* BE ../../..ED.*/
16: /* (XADJ, ADJNCY) - ADJACENCY STRUCTURE PAIR FOR THE*/
17: /* GIVEN GRAPH.*/
18: /* MASK - IS USED TO SPECIFY A SECTION SUBGRAPH. NODES*/
19: /* WITH MASK(I)=0 ARE IGNORED.*/
20: /* OUTPUT PARAMETERS -*/
21: /* NLVL - IS THE NUMBER OF LEVELS IN THE LEVEL STRUCTURE.*/
22: /* (XLS, LS) - ARRAY PAIR FOR THE ../../..ED LEVEL STRUCTURE.*/
23: /*****************************************************************/
24: int SPARSEPACKrootls(int *root, int *xadj, int *adjncy,
25: int *mask, int *nlvl, int *xls, int *ls)
26: {
27: /* System generated locals */
28: int i__1, i__2;
30: /* Local variables */
31: int node, i, j, jstop, jstrt, lbegin, ccsize, lvlend, lvsize,
32: nbr;
34: /* INITIALIZATION ...*/
38: /* Parameter adjustments */
39: --ls;
40: --xls;
41: --mask;
42: --adjncy;
43: --xadj;
45: mask[*root] = 0;
46: ls[1] = *root;
47: *nlvl = 0;
48: lvlend = 0;
49: ccsize = 1;
50: /* LBEGIN IS THE POINTER TO THE BEGINNING OF THE CURRENT*/
51: /* LEVEL, AND LVLEND POINTS TO THE END OF THIS LEVEL.*/
52: L200:
53: lbegin = lvlend + 1;
54: lvlend = ccsize;
55: ++(*nlvl);
56: xls[*nlvl] = lbegin;
57: /* GENERATE THE NEXT LEVEL BY FINDING ALL THE MASKED */
58: /* NEIGHBORS OF NODES IN THE CURRENT LEVEL.*/
59: i__1 = lvlend;
60: for (i = lbegin; i <= i__1; ++i) {
61: node = ls[i];
62: jstrt = xadj[node];
63: jstop = xadj[node + 1] - 1;
64: if (jstop < jstrt) {
65: goto L400;
66: }
67: i__2 = jstop;
68: for (j = jstrt; j <= i__2; ++j) {
69: nbr = adjncy[j];
70: if (mask[nbr] == 0) {
71: goto L300;
72: }
73: ++ccsize;
74: ls[ccsize] = nbr;
75: mask[nbr] = 0;
76: L300:
77: ;
78: }
79: L400:
80: ;
81: }
82: /* COMPUTE THE CURRENT LEVEL WIDTH.*/
83: /* IF IT IS NONZERO, GENERATE THE NEXT LEVEL.*/
84: lvsize = ccsize - lvlend;
85: if (lvsize > 0) {
86: goto L200;
87: }
88: /* RESET MASK TO ONE FOR THE NODES IN THE LEVEL STRUCTURE.*/
89: xls[*nlvl + 1] = lvlend + 1;
90: i__1 = ccsize;
91: for (i = 1; i <= i__1; ++i) {
92: node = ls[i];
93: mask[node] = 1;
94: }
95: return(0);
96: }