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