Actual source code: degree.c
1: #define PETSCMAT_DLL
3: /* degree.f -- translated by f2c (version 19931217).*/
5: #include petsc.h
6: #include src/mat/order/order.h
8: /*****************************************************************/
9: /********* DEGREE ..... DEGREE IN MASKED COMPONENT *********/
10: /*****************************************************************/
12: /* PURPOSE - THIS ROUTINE COMPUTES THE DEGREES OF THE NODES*/
13: /* IN THE CONNECTED COMPONENT SPECIFIED BY MASK AND ../../..*/
14: /* NODES FOR WHICH MASK IS ZERO ARE IGNORED.*/
16: /* INPUT PARAMETER -*/
17: /* ../../.. - IS THE INPUT NODE THAT DEFINES THE COMPONENT.*/
18: /* (XADJ, ADJNCY) - ADJACENCY STRUCTURE PAIR.*/
19: /* MASK - SPECIFIES A SECTION SUBGRAPH.*/
21: /* OUTPUT PARAMETERS -*/
22: /* DEG - ARRAY CONTAINING THE DEGREES OF THE NODES IN*/
23: /* THE COMPONENT.*/
24: /* CCSIZE-SIZE OF THE COMPONENT SPECIFED BY MASK AND ../../..*/
25: /* WORKING PARAMETER -*/
26: /* LS - A TEMPORARY VECTOR USED TO STORE THE NODES OF THE*/
27: /* COMPONENT LEVEL BY LEVEL.*/
28: /*****************************************************************/
31: PetscErrorCode SPARSEPACKdegree(PetscInt *root, PetscInt *xadj,PetscInt *adjncy,PetscInt *mask,PetscInt *deg,PetscInt *ccsize,PetscInt *ls)
32: {
33: /* System generated locals */
34: PetscInt i__1,i__2;
36: /* Local variables */
37: PetscInt ideg,node,i,j,jstop,jstrt,lbegin,lvlend,lvsize,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], (PetscInt)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]) {
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: }