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: }