Actual source code: gennd.c
2: /* gennd.f -- translated by f2c (version 19931217).*/
4: #include <petscsys.h>
8: PetscErrorCode SPARSEPACKrevrse(PetscInt *n,PetscInt *perm)
9: {
10: /* System generated locals */
11: PetscInt i__1;
13: /* Local variables */
14: PetscInt 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: PetscErrorCode SPARSEPACKgennd(PetscInt *neqns,PetscInt *xadj,PetscInt *adjncy,PetscInt *mask,PetscInt *perm,PetscInt *xls,PetscInt *ls)
60: {
61: /* System generated locals */
62: PetscInt i__1;
64: /* Local variables */
65: PetscInt nsep,root,i;
67: PetscInt 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]) {
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: }