Actual source code: qmdupd.c

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

 4:  #include petsc.h

  6: /******************************************************************/
  7: /***********     QMDUPD ..... QUOT MIN DEG UPDATE      ************/
  8: /******************************************************************/
  9: /******************************************************************/

 11: /*    PURPOSE - THIS ROUTINE PERFORMS DEGREE UPDATE FOR A SET*/
 12: /*       OF NODES IN THE MINIMUM DEGREE ALGORITHM.*/

 14: /*    INPUT PARAMETERS -*/
 15: /*       (XADJ, ADJNCY) - THE ADJACENCY STRUCTURE.*/
 16: /*       (NLIST, LIST) - THE LIST OF NODES WHOSE DEGREE HAS TO*/
 17: /*              BE UPDATED.*/

 19: /*    UPDATED PARAMETERS -*/
 20: /*       DEG - THE DEGREE VECTOR.*/
 21: /*       QSIZE - SIZE OF INDISTINGUISHABLE SUPERNODES.*/
 22: /*       QLINK - LINKED LIST FOR INDISTINGUISHABLE NODES.*/
 23: /*       MARKER - USED TO MARK THOSE NODES IN REACH/NBRHD SETS.*/

 25: /*    WORKING PARAMETERS -*/
 26: /*       RCHSET - THE REACHABLE SET.*/
 27: /*       NBRHD -  THE NEIGHBORHOOD SET.*/

 29: /*    PROGRAM SUBROUTINES -*/
 30: /*       QMDMRG.*/
 31: /******************************************************************/
 32: int SPARSEPACKqmdupd(int *xadj, int *adjncy, int *nlist, 
 33:         int *list, int *deg, int *qsize, int *qlink, int *
 34:         marker, int *rchset, int *nbrhd)
 35: {
 36:     /* System generated locals */
 37:     int i__1, i__2;

 39:     /* Local variables */
 40:     int inhd, irch, node, mark, j, inode, nabor, jstop, jstrt, il;
 41:     EXTERN int SPARSEPACKqmdrch(int *, int *, int *,
 42:             int *, int *, int *, int *, int *, int *),
 43:              SPARSEPACKqmdmrg(int *, int *, int *, int *, int *,
 44:             int *, int *, int *, int *, int *, int *);
 45:     int nhdsze, rchsze, deg0, deg1;

 47: /*       FIND ALL ELIMINATED SUPERNODES THAT ARE ADJACENT*/
 48: /*       TO SOME NODES IN THE GIVEN LIST. PUT THEM INTO.*/
 49: /*       (NHDSZE, NBRHD). DEG0 CONTAINS THE NUMBER OF*/
 50: /*       NODES IN THE LIST.*/


 54:     /* Parameter adjustments */
 55:     --nbrhd;
 56:     --rchset;
 57:     --marker;
 58:     --qlink;
 59:     --qsize;
 60:     --deg;
 61:     --list;
 62:     --adjncy;
 63:     --xadj;

 65:     if (*nlist <= 0) {
 66:         return(0);
 67:     }
 68:     deg0 = 0;
 69:     nhdsze = 0;
 70:     i__1 = *nlist;
 71:     for (il = 1; il <= i__1; ++il) {
 72:         node = list[il];
 73:         deg0 += qsize[node];
 74:         jstrt = xadj[node];
 75:         jstop = xadj[node + 1] - 1;
 76:         i__2 = jstop;
 77:         for (j = jstrt; j <= i__2; ++j) {
 78:             nabor = adjncy[j];
 79:             if (marker[nabor] != 0 || deg[nabor] >= 0) {
 80:                 goto L100;
 81:             }
 82:             marker[nabor] = -1;
 83:             ++nhdsze;
 84:             nbrhd[nhdsze] = nabor;
 85: L100:
 86:             ;
 87:         }
 88:     }
 89: /*       MERGE INDISTINGUISHABLE NODES IN THE LIST BY*/
 90: /*       CALLING THE SUBROUTINE QMDMRG.*/
 91:     if (nhdsze > 0) {
 92:         SPARSEPACKqmdmrg(&xadj[1], &adjncy[1], &deg[1], &qsize[1], &qlink[1], &marker[
 93:                 1], &deg0, &nhdsze, &nbrhd[1], &rchset[1], &nbrhd[nhdsze + 1]);
 94:     }
 95: /*       FIND THE NEW DEGREES OF THE NODES THAT HAVE NOT BEEN*/
 96: /*       MERGED.*/
 97:     i__1 = *nlist;
 98:     for (il = 1; il <= i__1; ++il) {
 99:         node = list[il];
100:         mark = marker[node];
101:         if (mark > 1 || mark < 0) {
102:             goto L600;
103:         }
104:         marker[node] = 2;
105:         SPARSEPACKqmdrch(&node, &xadj[1], &adjncy[1], &deg[1], &marker[1], &rchsze, &
106:                 rchset[1], &nhdsze, &nbrhd[1]);
107:         deg1 = deg0;
108:         if (rchsze <= 0) {
109:             goto L400;
110:         }
111:         i__2 = rchsze;
112:         for (irch = 1; irch <= i__2; ++irch) {
113:             inode = rchset[irch];
114:             deg1 += qsize[inode];
115:             marker[inode] = 0;
116:         }
117: L400:
118:         deg[node] = deg1 - 1;
119:         if (nhdsze <= 0) {
120:             goto L600;
121:         }
122:         i__2 = nhdsze;
123:         for (inhd = 1; inhd <= i__2; ++inhd) {
124:             inode = nbrhd[inhd];
125:             marker[inode] = 0;
126:         }
127: L600:
128:         ;
129:     }
130:     return(0);
131: }