Actual source code: fndsep.c

  1: /*$Id: fndsep.c,v 1.22 2001/03/23 23:22:51 balay Exp $*/
  2: /* fndsep.f -- translated by f2c (version 19931217).
  3: */

 5:  #include petsc.h
 6:  #include src/mat/order/order.h

  8: /*****************************************************************/
  9: /*************     FNDSEP ..... FIND SEPARATOR       *************/
 10: /*****************************************************************/
 11: /*    PURPOSE - THIS ROUTINE IS USED TO FIND A SMALL             */
 12: /*              SEPARATOR FOR A CONNECTED COMPONENT SPECIFIED    */
 13: /*              BY MASK IN THE GIVEN GRAPH.                      */
 14: /*                                                               */
 15: /*    INPUT PARAMETERS -                                         */
 16: /*       ../../.. - IS THE NODE THAT DETERMINES THE MASKED           */
 17: /*              COMPONENT.                                       */
 18: /*       (XADJ, ADJNCY) - THE ADJACENCY STRUCTURE PAIR.          */
 19: /*                                                               */
 20: /*    OUTPUT PARAMETERS -                                        */
 21: /*       NSEP - NUMBER OF VARIABLES IN THE SEPARATOR.            */
 22: /*       SEP - VECTOR CONTAINING THE SEPARATOR NODES.            */
 23: /*                                                               */
 24: /*    UPDATED PARAMETER -                                        */
 25: /*       MASK - NODES IN THE SEPARATOR HAVE THEIR MASK           */
 26: /*              VALUES SET TO ZERO.                              */
 27: /*                                                               */
 28: /*    WORKING PARAMETERS -                                       */
 29: /*       (XLS, LS) - LEVEL STRUCTURE PAIR FOR LEVEL STRUCTURE    */
 30: /*              FOUND BY FN../../...                                 */
 31: /*                                                               */
 32: /*    PROGRAM SUBROUTINES -                                      */
 33: /*       FN../../...                                                 */
 34: /*                                                               */
 35: /*****************************************************************/
 36: int SPARSEPACKfndsep(int *root, int *xadj, int *adjncy, 
 37:         int *mask, int *nsep, int *sep, int *xls, int *ls)
 38: {
 39:     /* System generated locals */
 40:     int i__1, i__2;

 42:     /* Local variables */
 43:     int node, nlvl, i, j, jstop, jstrt, mp1beg, mp1end, midbeg,
 44:             midend, midlvl;
 45:     EXTERN int SPARSEPACKfnroot(int *, int *, int *,
 46:             int *, int *, int *, int *);
 47:     int nbr;

 50:     /* Parameter adjustments */
 51:     --ls;
 52:     --xls;
 53:     --sep;
 54:     --mask;
 55:     --adjncy;
 56:     --xadj;

 58:     SPARSEPACKfnroot(root, &xadj[1], &adjncy[1], &mask[1], &nlvl, &xls[1], &ls[1]);
 59: /*       IF THE NUMBER OF LEVELS IS LESS THAN 3, RETURN */
 60: /*       THE WHOLE COMPONENT AS THE SEPARATOR.*/
 61:     if (nlvl >= 3) {
 62:         goto L200;
 63:     }
 64:     *nsep = xls[nlvl + 1] - 1;
 65:     i__1 = *nsep;
 66:     for (i = 1; i <= i__1; ++i) {
 67:         node = ls[i];
 68:         sep[i] = node;
 69:         mask[node] = 0;
 70:     }
 71:     return(0);
 72: /*       FIND THE MIDDLE LEVEL OF THE ../../..ED LEVEL STRUCTURE.*/
 73: L200:
 74:     midlvl = (nlvl + 2) / 2;
 75:     midbeg = xls[midlvl];
 76:     mp1beg = xls[midlvl + 1];
 77:     midend = mp1beg - 1;
 78:     mp1end = xls[midlvl + 2] - 1;
 79: /*       THE SEPARATOR IS OBTAINED BY INCLUDING ONLY THOSE*/
 80: /*       MIDDLE-LEVEL NODES WITH NEIGHBORS IN THE MIDDLE+1*/
 81: /*       LEVEL. XADJ IS USED TEMPORARILY TO MARK THOSE*/
 82: /*       NODES IN THE MIDDLE+1 LEVEL.*/
 83:     i__1 = mp1end;
 84:     for (i = mp1beg; i <= i__1; ++i) {
 85:         node = ls[i];
 86:         xadj[node] = -xadj[node];
 87:     }
 88:     *nsep = 0;
 89:     i__1 = midend;
 90:     for (i = midbeg; i <= i__1; ++i) {
 91:         node = ls[i];
 92:         jstrt = xadj[node];
 93:         jstop = (i__2 = xadj[node + 1], (int)PetscAbsInt(i__2)) - 1;
 94:         i__2 = jstop;
 95:         for (j = jstrt; j <= i__2; ++j) {
 96:             nbr = adjncy[j];
 97:             if (xadj[nbr] > 0) {
 98:                 goto L400;
 99:             }
100:             ++(*nsep);
101:             sep[*nsep] = node;
102:             mask[node] = 0;
103:             goto L500;
104: L400:
105:             ;
106:         }
107: L500:
108:         ;
109:     }
110: /*       RESET XADJ TO ITS CORRECT SIGN.*/
111:     i__1 = mp1end;
112:     for (i = mp1beg; i <= i__1; ++i) {
113:         node = ls[i];
114:         xadj[node] = -xadj[node];
115:     }
116:     return(0);
117: }