Actual source code: degree.c
1: /*$Id: degree.c,v 1.21 2001/03/23 23:22:51 balay Exp $*/
2: /* degree.f -- translated by f2c (version 19931217).*/
4: #include petsc.h
5: #include src/mat/order/order.h
7: /*****************************************************************/
8: /********* DEGREE ..... DEGREE IN MASKED COMPONENT *********/
9: /*****************************************************************/
11: /* PURPOSE - THIS ROUTINE COMPUTES THE DEGREES OF THE NODES*/
12: /* IN THE CONNECTED COMPONENT SPECIFIED BY MASK AND ../../..*/
13: /* NODES FOR WHICH MASK IS ZERO ARE IGNORED.*/
15: /* INPUT PARAMETER -*/
16: /* ../../.. - IS THE INPUT NODE THAT DEFINES THE COMPONENT.*/
17: /* (XADJ, ADJNCY) - ADJACENCY STRUCTURE PAIR.*/
18: /* MASK - SPECIFIES A SECTION SUBGRAPH.*/
20: /* OUTPUT PARAMETERS -*/
21: /* DEG - ARRAY CONTAINING THE DEGREES OF THE NODES IN*/
22: /* THE COMPONENT.*/
23: /* CCSIZE-SIZE OF THE COMPONENT SPECIFED BY MASK AND ../../..*/
24: /* WORKING PARAMETER -*/
25: /* LS - A TEMPORARY VECTOR USED TO STORE THE NODES OF THE*/
26: /* COMPONENT LEVEL BY LEVEL.*/
27: /*****************************************************************/
30: int SPARSEPACKdegree(int *root, int *xadj,int *adjncy,int *mask,int *deg,int *ccsize,int *ls)
31: {
32: /* System generated locals */
33: int i__1,i__2;
35: /* Local variables */
36: int ideg,node,i,j,jstop,jstrt,lbegin,lvlend,lvsize,
37: nbr;
38: /* INITIALIZATION ...*/
39: /* THE ARRAY XADJ IS USED AS A TEMPORARY MARKER TO*/
40: /* INDICATE WHICH NODES HAVE BEEN CONSIDERED SO FAR.*/
43: /* Parameter adjustments */
44: --ls;
45: --deg;
46: --mask;
47: --adjncy;
48: --xadj;
50: ls[1] = *root;
51: xadj[*root] = -xadj[*root];
52: lvlend = 0;
53: *ccsize = 1;
54: /* LBEGIN IS THE POINTER TO THE BEGINNING OF THE CURRENT*/
55: /* LEVEL, AND LVLEND POINTS TO THE END OF THIS LEVEL.*/
56: L100:
57: lbegin = lvlend + 1;
58: lvlend = *ccsize;
59: /* FIND THE DEGREES OF NODES IN THE CURRENT LEVEL,*/
60: /* AND AT THE SAME TIME, GENERATE THE NEXT LEVEL.*/
61: i__1 = lvlend;
62: for (i = lbegin; i <= i__1; ++i) {
63: node = ls[i];
64: jstrt = -xadj[node];
65: jstop = (i__2 = xadj[node + 1], (int)PetscAbsInt(i__2)) - 1;
66: ideg = 0;
67: if (jstop < jstrt) {
68: goto L300;
69: }
70: i__2 = jstop;
71: for (j = jstrt; j <= i__2; ++j) {
72: nbr = adjncy[j];
73: if (mask[nbr] == 0) {
74: goto L200;
75: }
76: ++ideg;
77: if (xadj[nbr] < 0) {
78: goto L200;
79: }
80: xadj[nbr] = -xadj[nbr];
81: ++(*ccsize);
82: ls[*ccsize] = nbr;
83: L200:
84: ;
85: }
86: L300:
87: deg[node] = ideg;
88: }
89: /* COMPUTE THE CURRENT LEVEL WIDTH. */
90: /* IF IT IS NONZERO, GENERATE ANOTHER LEVEL.*/
91: lvsize = *ccsize - lvlend;
92: if (lvsize > 0) {
93: goto L100;
94: }
95: /* RESET XADJ TO ITS CORRECT SIGN AND RETURN. */
96: /* ------------------------------------------*/
97: i__1 = *ccsize;
98: for (i = 1; i <= i__1; ++i) {
99: node = ls[i];
100: xadj[node] = -xadj[node];
101: }
102: return(0);
103: }