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