Actual source code: fndsep.c

  2: /* fndsep.f -- translated by f2c (version 19931217).
  3: */

  5: #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: /*****************************************************************/
 38: PetscErrorCode SPARSEPACKfndsep(PetscInt *root, PetscInt *xadj, PetscInt *adjncy, 
 39:                                 PetscInt *mask, PetscInt *nsep, PetscInt *sep, PetscInt *xls, PetscInt *ls)
 40: {
 41:     /* System generated locals */
 42:     PetscInt i__1, i__2;

 44:     /* Local variables */
 45:     PetscInt node, nlvl, i, j, jstop, jstrt, mp1beg, mp1end, midbeg, midend, midlvl;
 46:     PetscInt nbr;

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

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