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

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

 11:     /* Local variables */
 12:     int swap,i,m,in;

 15:     /* Parameter adjustments */
 16:     --perm;

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


 31: /*****************************************************************/
 32: /*********     GENND ..... GENERAL NESTED DISSECTION     *********/
 33: /*****************************************************************/

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

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

 42: /*    OUTPUT PARAMETERS -*/
 43: /*       PERM - THE NESTED DISSECTION ORDERING.*/

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

 51: /*    PROGRAM SUBROUTINES -*/
 52: /*       FNDSEP, REVRSE.*/
 53: /*****************************************************************/

 55: int SPARSEPACKgennd(int *neqns,int *xadj,int *adjncy,int *mask,int *perm,int *xls,int *ls)
 56: {
 57:     /* System generated locals */
 58:     int i__1;

 60:     /* Local variables */
 61:     int nsep,root,i;
 62:     EXTERN int SPARSEPACKfndsep(int *,int *,int *,int *,int *,int *,int *,int *);
 63:     int num;

 66:     /* Parameter adjustments */
 67:     --ls;
 68:     --xls;
 69:     --perm;
 70:     --mask;
 71:     --adjncy;
 72:     --xadj;

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