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