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