📄 ordmmd.c
字号:
/* ordmmd.f -- translated by f2c (version 19951025). You must link the resulting object file with the libraries: -lf2c -lm (in that order)*/typedef int integer; /* removed "long" *//* *********************************************************************** *//* *********************************************************************** *//* Version: 0.3 *//* Last modified: December 27, 1994 *//* Authors: Esmond G. Ng and Barry W. Peyton *//* Mathematical Sciences Section, Oak Ridge National Laboratory *//* *********************************************************************** *//* *********************************************************************** *//* **** ORDMMD ..... MULTIPLE MINIMUM EXTERNAL DEGREE ************ *//* *********************************************************************** *//* *********************************************************************** *//* PURPOSE - THIS ROUTINE CALLS LIU'S MULTIPLE MINIMUM DEGREE *//* ROUTINE. *//* INPUT PARAMETERS - *//* NEQNS - NUMBER OF EQUATIONS. *//* IWSIZ - SIZE OF INTEGER WORKING STORAGE. *//* OUTPUT PARAMETERS - *//* PERM - THE MINIMUM DEGREE ORDERING. *//* INVP - THE INVERSE OF PERM. *//* NOFSUB - AN UPPER BOUND ON THE NUMBER OF NONZERO *//* SUBSCRIPTS FOR THE COMPRESSED STORAGE SCHEME. *//* IFLAG - ERROR FLAG. *//* 0: SUCCESSFUL ORDERING *//* -1: INSUFFICIENT WORKING STORAGE *//* [IWORK(*)]. *//* UPDATED PARAMETER - *//* (** JFS 2/9/98 MOVED TO UPDATED: *//* (XADJ,ADJNCY) - ON INPUT, THE ADJACENCY STRUCTURE, *//* ON OUTPUT UNDEFINED. *//* **) *//* WORKING PARAMETERS - *//* IWORK - INTEGER WORKSPACE OF LENGTH 4*NEQNS. *//* *********************************************************************** *//* Subroutine */ int ordmmd_(neqns, xadj, adjncy, invp, perm, iwsiz, iwork, nofsub, iflag)integer *neqns, *xadj, *adjncy, *invp, *perm, *iwsiz, *iwork, *nofsub, *iflag;{ static integer delta; extern /* Subroutine */ int genmmd_(); static integer maxint;/* *********************************************************************** *//* ********************************************************************* */ /* Parameter adjustments */ --iwork; --perm; --invp; --adjncy; --xadj; /* Function Body */ *iflag = 0; if (*iwsiz < *neqns << 2) { *iflag = -1; return 0; }/* DELTA - TOLERANCE VALUE FOR MULTIPLE ELIMINATION. *//* MAXINT - MAXIMUM MACHINE REPRESENTABLE (SHORT) INTEGER *//* (ANY SMALLER ESTIMATE WILL DO) FOR MARKING *//* NODES. */ delta = 0; maxint = 32767; genmmd_(neqns, &xadj[1], &adjncy[1], &invp[1], &perm[1], &delta, &iwork[1] , &iwork[*neqns + 1], &iwork[(*neqns << 1) + 1], &iwork[*neqns * 3 + 1], &maxint, nofsub); return 0;} /* ordmmd_ *//* *********************************************************************** *//* *********************************************************************** *//* Version: 0.3 *//* Last modified: December 27, 1994 *//* Authors: Joseph W.H. Liu *//* Mathematical Sciences Section, Oak Ridge National Laboratory *//* *********************************************************************** *//* *********************************************************************** *//* --- SPARSPAK-A (ANSI FORTRAN) RELEASE III --- NAME = GENMMD *//* (C) UNIVERSITY OF WATERLOO JANUARY 1984 *//* *********************************************************************** *//* *********************************************************************** *//* **** GENMMD ..... MULTIPLE MINIMUM EXTERNAL DEGREE ************ *//* *********************************************************************** *//* *********************************************************************** *//* PURPOSE - THIS ROUTINE IMPLEMENTS THE MINIMUM DEGREE *//* ALGORITHM. IT MAKES USE OF THE IMPLICIT REPRESENTATION *//* OF ELIMINATION GRAPHS BY QUOTIENT GRAPHS, AND THE *//* NOTION OF INDISTINGUISHABLE NODES. IT ALSO IMPLEMENTS *//* THE MODIFICATIONS BY MULTIPLE ELIMINATION AND MINIMUM *//* EXTERNAL DEGREE. *//* --------------------------------------------- *//* CAUTION - THE ADJACENCY VECTOR ADJNCY WILL BE *//* DESTROYED. *//* --------------------------------------------- *//* INPUT PARAMETERS - *//* NEQNS - NUMBER OF EQUATIONS. *//* (XADJ,ADJNCY) - THE ADJACENCY STRUCTURE. *//* DELTA - TOLERANCE VALUE FOR MULTIPLE ELIMINATION. *//* MAXINT - MAXIMUM MACHINE REPRESENTABLE (SHORT) INTEGER *//* (ANY SMALLER ESTIMATE WILL DO) FOR MARKING *//* NODES. *//* OUTPUT PARAMETERS - *//* PERM - THE MINIMUM DEGREE ORDERING. *//* INVP - THE INVERSE OF PERM. *//* NOFSUB - AN UPPER BOUND ON THE NUMBER OF NONZERO *//* SUBSCRIPTS FOR THE COMPRESSED STORAGE SCHEME. *//* WORKING PARAMETERS - *//* DHEAD - VECTOR FOR HEAD OF DEGREE LISTS. *//* INVP - USED TEMPORARILY FOR DEGREE FORWARD LINK. *//* PERM - USED TEMPORARILY FOR DEGREE BACKWARD LINK. *//* QSIZE - VECTOR FOR SIZE OF SUPERNODES. *//* LLIST - VECTOR FOR TEMPORARY LINKED LISTS. *//* MARKER - A TEMPORARY MARKER VECTOR. *//* PROGRAM SUBROUTINES - *//* MMDELM, MMDINT, MMDNUM, MMDUPD. *//* *********************************************************************** *//* Subroutine */ int genmmd_(neqns, xadj, adjncy, invp, perm, delta, dhead, qsize, llist, marker, maxint, nofsub)integer *neqns, *xadj, *adjncy, *invp, *perm, *delta, *dhead, *qsize, *llist, *marker, *maxint, *nofsub;{ /* System generated locals */ integer i__1; /* Local variables */ static integer mdeg, ehead, i__, mdlmt, mdnode; extern /* Subroutine */ int mmdelm_(), mmdupd_(), mmdint_(), mmdnum_(); static integer nextmd, tag, num;/* *********************************************************************** *//* *********************************************************************** */ /* Parameter adjustments */ --marker; --llist; --qsize; --dhead; --perm; --invp; --adjncy; --xadj; /* Function Body */ if (*neqns <= 0) { return 0; }/* ------------------------------------------------ *//* INITIALIZATION FOR THE MINIMUM DEGREE ALGORITHM. *//* ------------------------------------------------ */ *nofsub = 0; mmdint_(neqns, &xadj[1], &adjncy[1], &dhead[1], &invp[1], &perm[1], & qsize[1], &llist[1], &marker[1]);/* ---------------------------------------------- *//* NUM COUNTS THE NUMBER OF ORDERED NODES PLUS 1. *//* ---------------------------------------------- */ num = 1;/* ----------------------------- *//* ELIMINATE ALL ISOLATED NODES. *//* ----------------------------- */ nextmd = dhead[1];L100: if (nextmd <= 0) { goto L200; } mdnode = nextmd; nextmd = invp[mdnode]; marker[mdnode] = *maxint; invp[mdnode] = -num; ++num; goto L100;L200:/* ---------------------------------------- *//* SEARCH FOR NODE OF THE MINIMUM DEGREE. *//* MDEG IS THE CURRENT MINIMUM DEGREE; *//* TAG IS USED TO FACILITATE MARKING NODES. *//* ---------------------------------------- */ if (num > *neqns) { goto L1000; } tag = 1; dhead[1] = 0; mdeg = 2;L300: if (dhead[mdeg] > 0) { goto L400; } ++mdeg; goto L300;L400:/* ------------------------------------------------- *//* USE VALUE OF DELTA TO SET UP MDLMT, WHICH GOVERNS *//* WHEN A DEGREE UPDATE IS TO BE PERFORMED. *//* ------------------------------------------------- */ mdlmt = mdeg + *delta; ehead = 0;L500: mdnode = dhead[mdeg]; if (mdnode > 0) { goto L600; } ++mdeg; if (mdeg > mdlmt) { goto L900; } goto L500;L600:/* ---------------------------------------- *//* REMOVE MDNODE FROM THE DEGREE STRUCTURE. *//* ---------------------------------------- */ nextmd = invp[mdnode]; dhead[mdeg] = nextmd; if (nextmd > 0) { perm[nextmd] = -mdeg; } invp[mdnode] = -num; *nofsub = *nofsub + mdeg + qsize[mdnode] - 2; if (num + qsize[mdnode] > *neqns) { goto L1000; }/* ---------------------------------------------- *//* ELIMINATE MDNODE AND PERFORM QUOTIENT GRAPH *//* TRANSFORMATION. RESET TAG VALUE IF NECESSARY. *//* ---------------------------------------------- */ ++tag; if (tag < *maxint) { goto L800; } tag = 1; i__1 = *neqns; for (i__ = 1; i__ <= i__1; ++i__) { if (marker[i__] < *maxint) { marker[i__] = 0; }/* L700: */ }L800: mmdelm_(&mdnode, &xadj[1], &adjncy[1], &dhead[1], &invp[1], &perm[1], & qsize[1], &llist[1], &marker[1], maxint, &tag); num += qsize[mdnode]; llist[mdnode] = ehead; ehead = mdnode; if (*delta >= 0) { goto L500; }L900:/* ------------------------------------------- *//* UPDATE DEGREES OF THE NODES INVOLVED IN THE *//* MINIMUM DEGREE NODES ELIMINATION. *//* ------------------------------------------- */ if (num > *neqns) { goto L1000; } mmdupd_(&ehead, neqns, &xadj[1], &adjncy[1], delta, &mdeg, &dhead[1], & invp[1], &perm[1], &qsize[1], &llist[1], &marker[1], maxint, &tag) ; goto L300;L1000: mmdnum_(neqns, &perm[1], &invp[1], &qsize[1]); return 0;} /* genmmd_ *//* *********************************************************************** *//* *********************************************************************** *//* Version: 0.3 *//* Last modified: December 27, 1994 *//* Authors: Joseph W.H. Liu *//* Mathematical Sciences Section, Oak Ridge National Laboratory *//* *********************************************************************** *//* *********************************************************************** *//* --- SPARSPAK-A (ANSI FORTRAN) RELEASE III --- NAME = MMDINT *//* (C) UNIVERSITY OF WATERLOO JANUARY 1984 *//* *********************************************************************** *//* *********************************************************************** *//* *** MMDINT ..... MULT MINIMUM DEGREE INITIALIZATION *********** *//* *********************************************************************** *//* *********************************************************************** *//* PURPOSE - THIS ROUTINE PERFORMS INITIALIZATION FOR THE *//* MULTIPLE ELIMINATION VERSION OF THE MINIMUM DEGREE *//* ALGORITHM. *//* INPUT PARAMETERS - *//* NEQNS - NUMBER OF EQUATIONS. *//* (XADJ,ADJNCY) - ADJACENCY STRUCTURE. *//* OUTPUT PARAMETERS - *//* (DHEAD,DFORW,DBAKW) - DEGREE DOUBLY LINKED STRUCTURE. *//* QSIZE - SIZE OF SUPERNODE (INITIALIZED TO ONE). *//* LLIST - LINKED LIST. *//* MARKER - MARKER VECTOR. *//* *********************************************************************** *//* Subroutine */ int mmdint_(neqns, xadj, adjncy, dhead, dforw, dbakw, qsize, llist, marker)integer *neqns, *xadj, *adjncy, *dhead, *dforw, *dbakw, *qsize, *llist, * marker;{ /* System generated locals */ integer i__1; /* Local variables */ static integer ndeg, node, fnode;/* *********************************************************************** *//* *********************************************************************** */ /* Parameter adjustments */ --marker; --llist; --qsize; --dbakw; --dforw; --dhead; --adjncy; --xadj; /* Function Body */ i__1 = *neqns; for (node = 1; node <= i__1; ++node) { dhead[node] = 0; qsize[node] = 1; marker[node] = 0; llist[node] = 0;/* L100: */ }/* ------------------------------------------ *//* INITIALIZE THE DEGREE DOUBLY LINKED LISTS. *//* ------------------------------------------ */ i__1 = *neqns; for (node = 1; node <= i__1; ++node) { ndeg = xadj[node + 1] - xadj[node] + 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -