📄 symbfct.c
字号:
/* symfct.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" */#if !defined(max)#define max(A, B) ((A) > (B) ? (A) : (B))#endif/* *********************************************************************** *//* *********************************************************************** *//* Version: 0.3 *//* Last modified: January 12, 1995 *//* Authors: Esmond G. Ng and Barry W. Peyton *//* Mathematical Sciences Section, Oak Ridge National Laboratory *//* *********************************************************************** *//* *********************************************************************** *//* ************** SFINIT ..... SET UP FOR SYMB. FACT. ************ *//* *********************************************************************** *//* *********************************************************************** *//* PURPOSE: *//* THIS SUBROUTINE COMPUTES THE STORAGE REQUIREMENTS AND SETS UP *//* PRELIMINARY DATA STRUCTURES FOR THE SYMBOLIC FACTORIZATION. *//* NOTE: *//* THIS VERSION PRODUCES THE MAXIMAL SUPERNODE PARTITION (I.E., *//* THE ONE WITH THE FEWEST POSSIBLE SUPERNODES). *//* INPUT PARAMETERS: *//* NEQNS - NUMBER OF EQUATIONS. *//* NNZA - LENGTH OF ADJACENCY STRUCTURE. *//* XADJ(*) - ARRAY OF LENGTH NEQNS+1, CONTAINING POINTERS *//* TO THE ADJACENCY STRUCTURE. *//* ADJNCY(*) - ARRAY OF LENGTH XADJ(NEQNS+1)-1, CONTAINING *//* THE ADJACENCY STRUCTURE. *//* IWSIZ - SIZE OF INTEGER WORKING STORAGE. *//* UPDATED PARAMETERS: *//* (* JFS Sept 1, 1998: moved "PERM" and "INVP" to updated section *) *//* (PERM,INVP) - ON INPUT, THE GIVEN PERM AND INVERSE PERM *//* VECTORS. ON OUTPUT, THE NEW PERM AND *//* INVERSE PERM VECTORS OF THE EQUIVALENT *//* ORDERING. *//* OUTPUT PARAMETERS: *//* COLCNT(*) - ARRAY OF LENGTH NEQNS, CONTAINING THE NUMBER *//* OF NONZEROS IN EACH COLUMN OF THE FACTOR, *//* INCLUDING THE DIAGONAL ENTRY. *//* NNZL - NUMBER OF NONZEROS IN THE FACTOR, INCLUDING *//* THE DIAGONAL ENTRIES. *//* NSUB - NUMBER OF SUBSCRIPTS. *//* NSUPER - NUMBER OF SUPERNODES (<= NEQNS). *//* SNODE(*) - ARRAY OF LENGTH NEQNS FOR RECORDING *//* SUPERNODE MEMBERSHIP. *//* XSUPER(*) - ARRAY OF LENGTH NEQNS+1, CONTAINING THE *//* SUPERNODE PARTITIONING. *//* IFLAG(*) - ERROR FLAG. *//* 0: SUCCESSFUL SF INITIALIZATION. *//* -1: INSUFFICENT WORKING STORAGE *//* [IWORK(*)]. *//* WORK PARAMETERS: *//* IWORK(*) - INTEGER WORK ARRAY OF LENGTH 7*NEQNS+3. *//* FIRST CREATED ON NOVEMBER 14, 1994. *//* LAST UPDATED ON January 12, 1995. *//* *********************************************************************** *//* Subroutine */ int sfinit_(neqns, nnza, xadj, adjncy, perm, invp, colcnt, nnzl, nsub, nsuper, snode, xsuper, iwsiz, iwork, iflag)integer *neqns, *nnza, *xadj, *adjncy, *perm, *invp, *colcnt, *nnzl, *nsub, * nsuper, *snode, *xsuper, *iwsiz, *iwork, *iflag;{ /* System generated locals */ integer i__1; /* Local variables */ extern /* Subroutine */ int fsup1_(), fsup2_(); static integer i__; extern /* Subroutine */ int fcnthn_(), chordr_(), etordr_();/* ----------- *//* PARAMETERS. *//* ----------- *//* *********************************************************************** *//* -------------------------------------------------------- *//* RETURN IF THERE IS INSUFFICIENT INTEGER WORKING STORAGE. *//* -------------------------------------------------------- */ /* Parameter adjustments */ --iwork; --xsuper; --snode; --colcnt; --invp; --perm; --xadj; --adjncy; /* Function Body */ *iflag = 0; if (*iwsiz < *neqns * 7 + 3) { *iflag = -1; return 0; }/* (* JFS: *//* ------------------------------------------------------------ *//* Handle the case of diagonal matrices separately, to avoid *//* an unsolved BUG in FCNTHN. *//* This patch is due to Jos F. Sturm, Sept 1, 1998. *//* ------------------------------------------------------------ */ if (xadj[*neqns + 1] - 1 == 0) { i__1 = *neqns; for (i__ = 1; i__ <= i__1; ++i__) { colcnt[i__] = 1; snode[i__] = i__; xsuper[i__] = i__;/* L10: */ } xsuper[*neqns + 1] = *neqns + 1; *nnzl = *neqns; *nsub = *neqns; *nsuper = *neqns; *iflag = 0; return 0; }/* ------------------------------------------------------------ *//* end of patch JFS *) *//* ------------------------------------------ *//* COMPUTE ELIMINATION TREE AND POSTORDERING. *//* ------------------------------------------ */ etordr_(neqns, &xadj[1], &adjncy[1], &perm[1], &invp[1], &iwork[1], & iwork[*neqns + 1], &iwork[(*neqns << 1) + 1], &iwork[*neqns * 3 + 1]);/* --------------------------------------------- *//* COMPUTE ROW AND COLUMN FACTOR NONZERO COUNTS. *//* --------------------------------------------- */ fcnthn_(neqns, nnza, &xadj[1], &adjncy[1], &perm[1], &invp[1], &iwork[1], &snode[1], &colcnt[1], nnzl, &iwork[*neqns + 1], &iwork[(*neqns << 1) + 1], &xsuper[1], &iwork[*neqns * 3 + 1], &iwork[(*neqns << 2) + 2], &iwork[*neqns * 5 + 3], &iwork[*neqns * 6 + 4]);/* --------------------------------------------------------- *//* REARRANGE CHILDREN SO THAT THE LAST CHILD HAS THE MAXIMUM *//* NUMBER OF NONZEROS IN ITS COLUMN OF L. *//* --------------------------------------------------------- */ chordr_(neqns, &xadj[1], &adjncy[1], &perm[1], &invp[1], &colcnt[1], & iwork[1], &iwork[*neqns + 1], &iwork[(*neqns << 1) + 1], &iwork[* neqns * 3 + 1]);/* ---------------- *//* FIND SUPERNODES. *//* ---------------- */ fsup1_(neqns, &iwork[1], &colcnt[1], nsub, nsuper, &snode[1]); fsup2_(neqns, nsuper, &iwork[1], &snode[1], &xsuper[1]); return 0;} /* sfinit_ *//* *********************************************************************** *//* *********************************************************************** *//* Version: 0.3 *//* Last modified: December 27, 1994 *//* Authors: Joseph W.H. Liu *//* Mathematical Sciences Section, Oak Ridge National Laboratory *//* *********************************************************************** *//* *********************************************************************** *//* ********** ETORDR ..... ELIMINATION TREE REORDERING *********** *//* *********************************************************************** *//* *********************************************************************** *//* WRITTEN BY JOSEPH LIU (JUL 17, 1985) *//* PURPOSE: *//* TO DETERMINE AN EQUIVALENT REORDERING BASED ON THE STRUCTURE OF *//* THE ELIMINATION TREE. A POSTORDERING OF THE GIVEN ELIMINATION *//* TREE IS RETURNED. *//* INPUT PARAMETERS: *//* NEQNS - NUMBER OF EQUATIONS. *//* (XADJ,ADJNCY) - THE ADJACENCY STRUCTURE. *//* UPDATED PARAMETERS: *//* (PERM,INVP) - ON INPUT, THE GIVEN PERM AND INVERSE PERM *//* VECTORS. ON OUTPUT, THE NEW PERM AND *//* INVERSE PERM VECTORS OF THE EQUIVALENT *//* ORDERING. *//* OUTPUT PARAMETERS: *//* PARENT - THE PARENT VECTOR OF THE ELIMINATION TREE *//* ASSOCIATED WITH THE NEW ORDERING. *//* WORKING PARAMETERS: *//* FSON - THE FIRST SON VECTOR. *//* BROTHR - THE BROTHER VECTOR. *//* INVPOS - THE INVERSE PERM VECTOR FOR THE *//* POSTORDERING. *//* PROGRAM SUBROUTINES: *//* BETREE, ETPOST, ETREE , INVINV. *//* *********************************************************************** *//* Subroutine */ int etordr_(neqns, xadj, adjncy, perm, invp, parent, fson, brothr, invpos)integer *neqns, *xadj, *adjncy, *perm, *invp, *parent, *fson, *brothr, * invpos;{ extern /* Subroutine */ int etree_(), betree_(), invinv_(), etpost_();/* *********************************************************************** *//* *********************************************************************** *//* ----------------------------- *//* COMPUTE THE ELIMINATION TREE. *//* ----------------------------- */ /* Parameter adjustments */ --invpos; --brothr; --fson; --parent; --invp; --perm; --adjncy; --xadj; /* Function Body */ etree_(neqns, &xadj[1], &adjncy[1], &perm[1], &invp[1], &parent[1], & invpos[1]);/* -------------------------------------------------------- *//* COMPUTE A BINARY REPRESENTATION OF THE ELIMINATION TREE. *//* -------------------------------------------------------- */ betree_(neqns, &parent[1], &fson[1], &brothr[1]);/* ------------------------------- *//* POSTORDER THE ELIMINATION TREE. *//* ------------------------------- */ etpost_(neqns, &fson[1], &brothr[1], &invpos[1], &parent[1], &perm[1]);/* -------------------------------------------------------- *//* COMPOSE THE ORIGINAL ORDERING WITH THE NEW POSTORDERING. *//* -------------------------------------------------------- */ invinv_(neqns, &invp[1], &invpos[1], &perm[1]); return 0;} /* etordr_ *//* *********************************************************************** *//* *********************************************************************** *//* Version: 0.3 *//* Last modified: December 27, 1994 *//* Authors: Joseph W.H. Liu *//* Mathematical Sciences Section, Oak Ridge National Laboratory *//* *********************************************************************** *//* *********************************************************************** *//* **************** ETREE ..... ELIMINATION TREE ***************** *//* *********************************************************************** *//* *********************************************************************** *//* WRITTEN BY JOSEPH LIU (JUL 17, 1985) *//* PURPOSE: *//* TO DETERMINE THE ELIMINATION TREE FROM A GIVEN ORDERING AND *//* THE ADJACENCY STRUCTURE. THE PARENT VECTOR IS RETURNED. *//* INPUT PARAMETERS: *//* NEQNS - NUMBER OF EQUATIONS. *//* (XADJ,ADJNCY) - THE ADJACENCY STRUCTURE. *//* (PERM,INVP) - PERMUTATION AND INVERSE PERMUTATION VECTORS *//* OUTPUT PARAMETERS: *//* PARENT - THE PARENT VECTOR OF THE ELIMINATION TREE. *//* WORKING PARAMETERS: *//* ANCSTR - THE ANCESTOR VECTOR. *//* *********************************************************************** *//* Subroutine */ int etree_(neqns, xadj, adjncy, perm, invp, parent, ancstr)integer *neqns, *xadj, *adjncy, *perm, *invp, *parent, *ancstr;{ /* System generated locals */ integer i__1, i__2; /* Local variables */ static integer node, next, i__, j, jstop, jstrt, nbr;/* *********************************************************************** *//* *********************************************************************** *//* *********************************************************************** */ /* Parameter adjustments */ --ancstr; --parent; --invp; --perm; --adjncy; --xadj; /* Function Body */ if (*neqns <= 0) { return 0; } i__1 = *neqns; for (i__ = 1; i__ <= i__1; ++i__) { parent[i__] = 0; ancstr[i__] = 0; node = perm[i__]; jstrt = xadj[node]; jstop = xadj[node + 1] - 1; if (jstrt <= jstop) { i__2 = jstop; for (j = jstrt; j <= i__2; ++j) { nbr = adjncy[j]; nbr = invp[nbr]; if (nbr < i__) {/* ------------------------------------------- *//* FOR EACH NBR, FIND THE ROOT OF ITS CURRENT *//* ELIMINATION TREE. PERFORM PATH COMPRESSION *//* AS THE SUBTREE IS TRAVERSED. *//* ------------------------------------------- */L100: if (ancstr[nbr] == i__) { goto L300; } if (ancstr[nbr] > 0) { next = ancstr[nbr]; ancstr[nbr] = i__; nbr = next; goto L100; }/* -------------------------------------------- *//* NOW, NBR IS THE ROOT OF THE SUBTREE. MAKE I *//* THE PARENT NODE OF THIS ROOT. *//* -------------------------------------------- */ parent[nbr] = i__; ancstr[nbr] = i__; }L300: ; } }/* L400: */ }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -