📄 symfct.c
字号:
/* THE PARENT NODE OF THIS ROOT. */
/* --------------------------------
------------ */
parent[nbr] = i__;
ancstr[nbr] = i__;
}
L300:
;
}
}
/* L400: */
}
return 0;
} /* etree_ */
/* *********************************************************************** */
/* *********************************************************************** */
/* Version: 0.3 */
/* Last modified: December 27, 1994 */
/* Authors: Joseph W.H. Liu */
/* Mathematical Sciences Section, Oak Ridge National Laboratory */
/* *********************************************************************** */
/* *********************************************************************** */
/* ****** BETREE ..... BINARY TREE REPRESENTATION OF ETREE ******* */
/* *********************************************************************** */
/* *********************************************************************** */
/* WRITTEN BY JOSEPH LIU (JUL 17, 1985) */
/* PURPOSE: */
/* TO DETERMINE THE BINARY TREE REPRESENTATION OF THE ELIMINATION */
/* TREE GIVEN BY THE PARENT VECTOR. THE RETURNED REPRESENTATION */
/* WILL BE GIVEN BY THE FIRST-SON AND BROTHER VECTORS. THE ROOT */
/* OF THE BINARY TREE IS ALWAYS NEQNS. */
/* INPUT PARAMETERS: */
/* NEQNS - NUMBER OF EQUATIONS. */
/* PARENT - THE PARENT VECTOR OF THE ELIMINATION TREE. */
/* IT IS ASSUMED THAT PARENT(I) > I EXCEPT OF */
/* THE ROOTS. */
/* OUTPUT PARAMETERS: */
/* FSON - THE FIRST SON VECTOR. */
/* BROTHR - THE BROTHER VECTOR. */
/* *********************************************************************** */
/* Subroutine */ int betree_(neqns, parent, fson, brothr)
integer *neqns, *parent, *fson, *brothr;
{
/* System generated locals */
integer i__1;
/* Local variables */
static integer node, ndpar, lroot;
/* ***********************************************************************
*/
/* ***********************************************************************
*/
/* ***********************************************************************
*/
/* Parameter adjustments */
--brothr;
--fson;
--parent;
/* Function Body */
if (*neqns <= 0) {
return 0;
}
i__1 = *neqns;
for (node = 1; node <= i__1; ++node) {
fson[node] = 0;
brothr[node] = 0;
/* L100: */
}
lroot = *neqns;
/* ------------------------------------------------------------ */
/* FOR EACH NODE := NEQNS-1 STEP -1 DOWNTO 1, DO THE FOLLOWING. */
/* ------------------------------------------------------------ */
if (*neqns <= 1) {
return 0;
}
for (node = *neqns - 1; node >= 1; --node) {
ndpar = parent[node];
if (ndpar <= 0 || ndpar == node) {
/* -------------------------------------------------
*/
/* NODE HAS NO PARENT. GIVEN STRUCTURE IS A FOREST.
*/
/* SET NODE TO BE ONE OF THE ROOTS OF THE TREES. */
/* -------------------------------------------------
*/
brothr[lroot] = node;
lroot = node;
} else {
/* ------------------------------------------- */
/* OTHERWISE, BECOMES FIRST SON OF ITS PARENT. */
/* ------------------------------------------- */
brothr[node] = fson[ndpar];
fson[ndpar] = node;
}
/* L300: */
}
brothr[lroot] = 0;
return 0;
} /* betree_ */
/* *********************************************************************** */
/* *********************************************************************** */
/* Version: 0.3 */
/* Last modified: December 27, 1994 */
/* Authors: Joseph W.H. Liu */
/* Mathematical Sciences Section, Oak Ridge National Laboratory */
/* *********************************************************************** */
/* *********************************************************************** */
/* *************** ETPOST ..... ETREE POSTORDERING *************** */
/* *********************************************************************** */
/* *********************************************************************** */
/* WRITTEN BY JOSEPH LIU (SEPT 17, 1986) */
/* PURPOSE: */
/* BASED ON THE BINARY REPRESENTATION (FIRST-SON,BROTHER) OF */
/* THE ELIMINATION TREE, A POSTORDERING IS DETERMINED. THE */
/* CORRESPONDING PARENT VECTOR IS ALSO MODIFIED TO REFLECT */
/* THE REORDERING. */
/* INPUT PARAMETERS: */
/* ROOT - ROOT OF THE ELIMINATION TREE (USUALLY IT */
/* IS NEQNS). */
/* FSON - THE FIRST SON VECTOR. */
/* BROTHR - THE BROTHR VECTOR. */
/* UPDATED PARAMETERS: */
/* PARENT - THE PARENT VECTOR. */
/* OUTPUT PARAMETERS: */
/* INVPOS - INVERSE PERMUTATION FOR THE POSTORDERING. */
/* WORKING PARAMETERS: */
/* STACK - THE STACK FOR POSTORDER TRAVERSAL OF THE */
/* TREE. */
/* *********************************************************************** */
/* Subroutine */ int etpost_(root, fson, brothr, invpos, parent, stack)
integer *root, *fson, *brothr, *invpos, *parent, *stack;
{
/* System generated locals */
integer i__1;
/* Local variables */
static integer node, itop, ndpar, nunode, num;
/* ***********************************************************************
*/
/* ***********************************************************************
*/
/* ***********************************************************************
*/
/* Parameter adjustments */
--stack;
--parent;
--invpos;
--brothr;
--fson;
/* Function Body */
num = 0;
itop = 0;
node = *root;
/* ------------------------------------------------------------- */
/* TRAVERSE ALONG THE FIRST SONS POINTER AND PUSH THE TREE NODES */
/* ALONG THE TRAVERSAL INTO THE STACK. */
/* ------------------------------------------------------------- */
L100:
++itop;
stack[itop] = node;
node = fson[node];
if (node > 0) {
goto L100;
}
/* ---------------------------------------------------------- */
/* IF POSSIBLE, POP A TREE NODE FROM THE STACK AND NUMBER IT. */
/* ---------------------------------------------------------- */
L200:
if (itop <= 0) {
goto L300;
}
node = stack[itop];
--itop;
++num;
invpos[node] = num;
/* ---------------------------------------------------- */
/* THEN, TRAVERSE TO ITS YOUNGER BROTHER IF IT HAS ONE. */
/* ---------------------------------------------------- */
node = brothr[node];
if (node <= 0) {
goto L200;
}
goto L100;
L300:
/* ------------------------------------------------------------ */
/* DETERMINE THE NEW PARENT VECTOR OF THE POSTORDERING. BROTHR */
/* IS USED TEMPORARILY FOR THE NEW PARENT VECTOR. */
/* ------------------------------------------------------------ */
i__1 = num;
for (node = 1; node <= i__1; ++node) {
nunode = invpos[node];
ndpar = parent[node];
if (ndpar > 0) {
ndpar = invpos[ndpar];
}
brothr[nunode] = ndpar;
/* L400: */
}
i__1 = num;
for (nunode = 1; nunode <= i__1; ++nunode) {
parent[nunode] = brothr[nunode];
/* L500: */
}
return 0;
} /* etpost_ */
/* *********************************************************************** */
/* *********************************************************************** */
/* Version: 0.3 */
/* Last modified: December 27, 1994 */
/* Authors: Joseph W.H. Liu */
/* Mathematical Sciences Section, Oak Ridge National Laboratory */
/* *********************************************************************** */
/* *********************************************************************** */
/* *********** INVINV ..... CONCATENATION OF TWO INVP ************ */
/* *********************************************************************** */
/* *********************************************************************** */
/* WRITTEN BY JOSEPH LIU (JUL 17, 1985) */
/* PURPOSE: */
/* TO PERFORM THE MAPPING OF */
/* ORIGINAL-INVP --> INTERMEDIATE-INVP --> NEW INVP */
/* AND THE RESULTING ORDERING REPLACES INVP. THE NEW PERMUTATION */
/* VECTOR PERM IS ALSO COMPUTED. */
/* INPUT PARAMETERS: */
/* NEQNS - NUMBER OF EQUATIONS. */
/* INVP2 - THE SECOND INVERSE PERMUTATION VECTOR. */
/* UPDATED PARAMETERS: */
/* INVP - THE FIRST INVERSE PERMUTATION VECTOR. ON */
/* OUTPUT, IT CONTAINS THE NEW INVERSE */
/* PERMUTATION. */
/* OUTPUT PARAMETER: */
/* PERM - NEW PERMUTATION VECTOR (CAN BE THE SAME AS */
/* INVP2). */
/* *********************************************************************** */
/* Subroutine */ int invinv_(neqns, invp, invp2, perm)
integer *neqns, *invp, *invp2, *perm;
{
/* System generated locals */
integer i__1;
/* Local variables */
static integer node, i__, interm;
/* ***********************************************************************
*/
/* ***********************************************************************
*/
/* ***********************************************************************
*/
/* Parameter adjustments */
--perm;
--invp2;
--invp;
/* Function Body */
i__1 = *neqns;
for (i__ = 1; i__ <= i__1; ++i__) {
interm = invp[i__];
invp[i__] = invp2[interm];
/* L100: */
}
i__1 = *neqns;
for (i__ = 1; i__ <= i__1; ++i__) {
node = invp[i__];
perm[node] = i__;
/* L200: */
}
return 0;
} /* invinv_ */
/* *********************************************************************** */
/* *********************************************************************** */
/* Version: 0.3 */
/* Last modified: December 27, 1994 */
/* Authors: Esmond G. Ng and Barry W. Peyton */
/* Mathematical Sciences Section, Oak Ridge National Laboratory */
/* *********************************************************************** */
/* *********************************************************************** */
/* ********** CHORDR ..... CHILD REORDERING *********** */
/* *********************************************************************** */
/* *********************************************************************** */
/* PURPOSE: */
/* REARRANGE THE CHILDREN OF EACH VERTEX SO THAT THE LAST ONE */
/* MAXIMIZES (AMONG THE CHILDREN) THE NUMBER OF NONZEROS IN THE */
/* CORRESPONDING COLUMN OF L. ALSO DETERMINE AN NEW POSTORDERING */
/* BASED ON THE STRUCTURE OF THE MODIFIED ELIMINATION TREE. */
/* 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 NEW */
/* POSTORDERING. */
/* COLCNT - COLUMN COUNTS IN L UNDER INITIAL ORDERING; */
/* MODIFIED TO REFLECT THE NEW ORDERING. */
/* OUTPUT PARAMETERS: */
/* PARENT - THE PARENT VECTOR OF THE ELIMINATION TREE */
/* ASSOCIATED WITH THE NEW ORDERING. */
/* WORKING PARAMETERS: */
/* FSON - THE FIRST SON VECTOR. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -