Esempio n. 1
0
PetscErrorCode SPARSEPACKfnroot(PetscInt *root,const PetscInt *xadj,const PetscInt *adjncy,PetscInt *mask, PetscInt *nlvl, PetscInt *xls, PetscInt *ls)
{
  /* System generated locals */
  PetscInt i__1, i__2;

  /* Local variables */
  PetscInt ndeg, node, j, k, nabor, kstop, jstrt, kstrt, mindeg, ccsize, nunlvl;
/*       DETERMINE THE LEVEL STRUCTURE ROOTED AT ROOT. */

  PetscFunctionBegin;
  /* Parameter adjustments */
  --ls;
  --xls;
  --mask;
  --adjncy;
  --xadj;

  SPARSEPACKrootls(root, &xadj[1], &adjncy[1], &mask[1], nlvl, &xls[1], &ls[1]);
  ccsize = xls[*nlvl + 1] - 1;
  if (*nlvl == 1 || *nlvl == ccsize) PetscFunctionReturn(0);

/*       PICK A NODE WITH MINIMUM DEGREE FROM THE LAST LEVEL.*/
L100:
  jstrt  = xls[*nlvl];
  mindeg = ccsize;
  *root  = ls[jstrt];
  if (ccsize == jstrt) goto L400;
  i__1 = ccsize;
  for (j = jstrt; j <= i__1; ++j) {
    node  = ls[j];
    ndeg  = 0;
    kstrt = xadj[node];
    kstop = xadj[node + 1] - 1;
    i__2  = kstop;
    for (k = kstrt; k <= i__2; ++k) {
      nabor = adjncy[k];
      if (mask[nabor] > 0) ++ndeg;
    }
    if (ndeg >= mindeg) goto L300;
    *root  = node;
    mindeg = ndeg;
L300:
    ;
  }
/*       AND GENERATE ITS ROOTED LEVEL STRUCTURE.*/
L400:
  SPARSEPACKrootls(root, &xadj[1], &adjncy[1], &mask[1], &nunlvl, &xls[1], &ls[1]);
  if (nunlvl <= *nlvl) PetscFunctionReturn(0);
  *nlvl = nunlvl;
  if (*nlvl < ccsize) goto L100;
  PetscFunctionReturn(0);
}
Esempio n. 2
0
PetscErrorCode SPARSEPACKgen1wd(const PetscInt *neqns,const PetscInt *xadj,const PetscInt *adjncy,PetscInt *mask, PetscInt *nblks, PetscInt *xblk, PetscInt *perm, PetscInt *xls, PetscInt *ls)
{
  /* System generated locals */
  PetscInt i__1, i__2, i__3;

  /* Local variables */
  PetscInt node, nsep, lnum, nlvl, root;
  PetscInt i, j, k, ccsize;
  PetscInt num;

  PetscFunctionBegin;
  /* Parameter adjustments */
  --ls;
  --xls;
  --perm;
  --xblk;
  --mask;
  --xadj;
  --adjncy;

  i__1 = *neqns;
  for (i = 1; i <= i__1; ++i) mask[i] = 1;
  *nblks = 0;
  num    = 0;
  i__1   = *neqns;
  for (i = 1; i <= i__1; ++i) {
    if (!mask[i]) goto L400;
/*             FIND A ONE-WAY DISSECTOR FOR EACH COMPONENT.*/
    root = i;
    SPARSEPACKfn1wd(&root, &xadj[1], &adjncy[1], &mask[1], &nsep, &perm[num + 1], &nlvl, &xls[1], &ls[1]);
    num += nsep;
    ++(*nblks);
    xblk[*nblks] = *neqns - num + 1;
    ccsize       = xls[nlvl + 1] - 1;
/*             NUMBER THE REMAINING NODES IN THE COMPONENT.*/
/*             EACH COMPONENT IN THE REMAINING SUBGRAPH FORMS*/
/*             A NEW BLOCK IN THE PARTITIONING.*/
    i__2 = ccsize;
    for (j = 1; j <= i__2; ++j) {
      node = ls[j];
      if (!mask[node]) goto L300;
      SPARSEPACKrootls(&node, &xadj[1], &adjncy[1], &mask[1], &nlvl, &xls[1], &perm[num + 1]);
      lnum = num + 1;
      num  = num + xls[nlvl + 1] - 1;
      ++(*nblks);
      xblk[*nblks] = *neqns - num + 1;
      i__3         = num;
      for (k = lnum; k <= i__3; ++k) {
        node       = perm[k];
        mask[node] = 0;
      }
      if (num > *neqns) goto L500;
L300:
      ;
    }
L400:
    ;
  }
/*       SINCE DISSECTORS FOUND FIRST SHOULD BE ORDERED LAST,*/
/*       ROUTINE REVRSE IS CALLED TO ADJUST THE ORDERING*/
/*       VECTOR, AND THE BLOCK INDEX VECTOR.*/
L500:
  SPARSEPACKrevrse(neqns, &perm[1]);
  SPARSEPACKrevrse(nblks, &xblk[1]);
  xblk[*nblks + 1] = *neqns + 1;
  PetscFunctionReturn(0);
}