Actual source code: gennd.c

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

 4:  #include petsc.h

  8: int SPARSEPACKrevrse(int *n,int *perm)
  9: {
 10:     /* System generated locals */
 11:     int i__1;

 13:     /* Local variables */
 14:     int swap,i,m,in;

 17:     /* Parameter adjustments */
 18:     --perm;

 20:     in = *n;
 21:     m = *n / 2;
 22:     i__1 = m;
 23:     for (i = 1; i <= i__1; ++i) {
 24:         swap = perm[i];
 25:         perm[i] = perm[in];
 26:         perm[in] = swap;
 27:         --in;
 28:     }
 29:     return(0);
 30: }


 33: /*****************************************************************/
 34: /*********     GENND ..... GENERAL NESTED DISSECTION     *********/
 35: /*****************************************************************/

 37: /*    PURPOSE - SUBROUTINE GENND FINDS A NESTED DISSECTION*/
 38: /*       ORDERING FOR A GENERAL GRAPH.*/

 40: /*    INPUT PARAMETERS -*/
 41: /*       NEQNS - NUMBER OF EQUATIONS.*/
 42: /*       (XADJ, ADJNCY) - ADJACENCY STRUCTURE PAIR.*/

 44: /*    OUTPUT PARAMETERS -*/
 45: /*       PERM - THE NESTED DISSECTION ORDERING.*/

 47: /*    WORKING PARAMETERS -*/
 48: /*       MASK - IS USED TO MASK OFF VARIABLES THAT HAVE*/
 49: /*              BEEN NUMBERED DURING THE ORDERNG PROCESS.*/
 50: /*       (XLS, LS) - THIS LEVEL STRUCTURE PAIR IS USED AS*/
 51: /*              TEMPORARY STORAGE BY FN../../...*/

 53: /*    PROGRAM SUBROUTINES -*/
 54: /*       FNDSEP, REVRSE.*/
 55: /*****************************************************************/

 59: int SPARSEPACKgennd(int *neqns,int *xadj,int *adjncy,int *mask,int *perm,int *xls,int *ls)
 60: {
 61:     /* System generated locals */
 62:     int i__1;

 64:     /* Local variables */
 65:     int nsep,root,i;
 66:     EXTERN int SPARSEPACKfndsep(int *,int *,int *,int *,int *,int *,int *,int *);
 67:     int num;

 70:     /* Parameter adjustments */
 71:     --ls;
 72:     --xls;
 73:     --perm;
 74:     --mask;
 75:     --adjncy;
 76:     --xadj;

 78:     i__1 = *neqns;
 79:     for (i = 1; i <= i__1; ++i) {
 80:         mask[i] = 1;
 81:     }
 82:     num = 0;
 83:     i__1 = *neqns;
 84:     for (i = 1; i <= i__1; ++i) {
 85: /*           FOR EACH MASKED COMPONENT ...*/
 86: L200:
 87:         if (mask[i] == 0) {
 88:             goto L300;
 89:         }
 90:         root = i;
 91: /*              FIND A SEPARATOR AND NUMBER THE NODES NEXT.*/
 92:         SPARSEPACKfndsep(&root,&xadj[1],&adjncy[1],&mask[1],&nsep,&perm[num + 1],
 93:                 &xls[1],&ls[1]);
 94:         num += nsep;
 95:         if (num >= *neqns) {
 96:             goto L400;
 97:         }
 98:         goto L200;
 99: L300:
100:         ;
101:     }
102: /*        SINCE SEPARATORS FOUND FIRST SHOULD BE ORDERED*/
103: /*        LAST, ROUTINE REVRSE IS CALLED TO ADJUST THE*/
104: /*        ORDERING VECTOR.*/
105: L400:
106:     SPARSEPACKrevrse(neqns,&perm[1]);
107:     return(0);
108: }