#include "pdsp_defs.h"
#include "util.h"
void
pxgstrf_super_bnd_dfs(
const int pnum, /* process number */
const int m, /* number of rows in the matrix */
const int n, /* number of columns in the matrix */
const int jcol, /* first column of the H-supernode */
const int w, /* size of the H-supernode */
SuperMatrix *A, /* original matrix */
int *perm_r, /* in */
int *iperm_r, /* in; inverse of perm_r */
int *xprune, /* in */
int *ispruned, /* in */
int *marker, /* modified */
int *parent, /* working array */
int *xplore, /* working array */
pxgstrf_shared_t *pxgstrf_shared /* modified */
)
{
/*
* -- SuperLU MT routine (version 1.0) --
* Univ. of California Berkeley, Xerox Palo Alto Research Center,
* and Lawrence Berkeley National Lab.
* August 15, 1997
*
* Purpose
* =======
*
* Performs a symbolic structure prediction on a supernode in the Householder
* matrix H, with jcol being the leading column.
*
*/
GlobalLU_t *Glu = pxgstrf_shared->Glu; /* modified */
register int krep, chperm, chrep, kchild;
register int invp_rep; /* "krep" numbered in the original A */
register int krow, kperm, xdfs, maxdfs, kpar;
register int fsupc, k, jj, found;
register int nrow; /* union of the nonzero rows in a supernode */
NCPformat *Astore;
int *asub, *xa_begin, *xa_end;
int *xsup, *xsup_end, *supno, *lsub, *xlsub, *xlsub_end;
/* Initialize pointers */
xsup = Glu->xsup;
xsup_end = Glu->xsup_end;
supno = Glu->supno;
lsub = Glu->lsub;
xlsub = Glu->xlsub;
xlsub_end = Glu->xlsub_end;
Astore = A->Store;
asub = Astore->rowind;
xa_begin = Astore->colbeg;
xa_end = Astore->colend;
nrow = 0;
found = n + jcol;
/* For each column in the H-supernode */
for (jj = jcol; jj < jcol + w; ++jj) {
/* For each nonz in A[*,jj] do dfs */
for (k = xa_begin[jj]; k < xa_end[jj]; ++k) {
krow = asub[k];
/* krow was visited before, go to the next nonzero. */
if ( marker[krow] == found ) continue;
/* For each unmarked nbr krow of jj ... */
kperm = perm_r[krow];
if ( kperm == EMPTY ) { /* krow is in L */
marker[krow] = found;
++nrow;
} else {
/* krow is in U: if its supernode-rep krep has been explored,
skip the search. */
krep = SUPER_REP( supno[kperm] );
invp_rep = iperm_r[krep];
/* Perform dfs starting at krep */
if ( marker[invp_rep] != found ) {
marker[invp_rep] = found;
parent[krep] = EMPTY;
if ( ispruned[krep] ) {
if ( SINGLETON( supno[krep] ) )
xdfs = xlsub_end[krep];
else xdfs = xlsub[krep];
maxdfs = xprune[krep];
} else {
fsupc = SUPER_FSUPC( supno[krep] );
xdfs = xlsub[fsupc] + krep-fsupc+1;
maxdfs = xlsub_end[fsupc];
}
do {
/* For each unmarked kchild of krep ... */
while ( xdfs < maxdfs ) {
kchild = lsub[xdfs];
xdfs++;
if (marker[kchild] != found) { /* Not reached yet */
chperm = perm_r[kchild];
if ( chperm == EMPTY ) { /* kchild is in L */
marker[kchild] = found;
++nrow;
} else {
/* kchild is in U:
* chrep = its supernode-rep. If its rep
* has been explored, skip the search.
*/
chrep = SUPER_REP( supno[chperm] );
invp_rep = iperm_r[chrep];
/* Continue dfs at snode-rep of kchild */
if ( marker[invp_rep] != found ) {
marker[invp_rep] = found;
xplore[krep] = xdfs;
xplore[m + krep] = maxdfs;
parent[chrep] = krep;
krep = chrep;/* Go deeper down G(L^t) */
xdfs = xlsub[krep];
maxdfs = xprune[krep];
if ( ispruned[krep] ) {
if ( SINGLETON( supno[krep] ) )
xdfs = xlsub_end[krep];
else xdfs = xlsub[krep];
maxdfs = xprune[krep];
} else {
fsupc = SUPER_FSUPC(supno[krep]);
xdfs = xlsub[fsupc] + krep-fsupc+1;
maxdfs = xlsub_end[fsupc];
}
} /* if */
} /* else */
} /* if... */
} /* while xdfs < maxdfs */
/* krow has no more unexplored nbrs:
* Place snode-rep krep in postorder dfs, if this
* segment is seen for the first time. Note that
* the "repfnz[krep]" may change later.
* Backtrack dfs to its parent.
*/
kpar = parent[krep]; /* Pop stack, mimic recursion */
if ( kpar == EMPTY ) break; /* dfs done */
krep = kpar;
xdfs = xplore[krep];
maxdfs = xplore[m+krep];
} while ( kpar != EMPTY ); /* do-while - until empty stack */
} /* if */
} /* else */
} /* for each nonz in A[*,jj] */
} /* for jj ... */
DynamicSetMap(pnum, jcol, nrow * w, pxgstrf_shared);
/* for (i = 1; i < w; ++i) Glu->map_in_sup[jcol + i] = -i;*/
#if ( DEBUGlevel>=1 )
printf("(%d) pxgstrf_super_bnd_dfs(): jcol= %d, w= %d, nrow= %d\n",
pnum, jcol, w, nrow);
#endif
}
syntax highlighted by Code2HTML, v. 0.9.1