#include "pdsp_defs.h"
int
pdgstrf_snode_dfs(
const int pnum, /* process number */
const int jcol, /* in - start of the supernode */
const int kcol, /* in - end of the supernode */
const int *asub, /* in */
const int *xa_begin, /* in */
const int *xa_end, /* in */
int *xprune, /* out */
int *marker, /* modified */
int *col_lsub, /* values are irrelevant on entry
and on return */
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
* =======
* pdgstrf_snode_dfs() determines the union of the row structures of
* those columns within the relaxed snode.
* Note: The relaxed snodes are leaves of the supernodal etree,
* therefore, the portion outside the rectangular supernode must be zero.
*
* Return value
* ============
* 0 success;
* >0 number of bytes allocated when run out of memory.
*
*/
GlobalLU_t *Glu = pxgstrf_shared->Glu;
register int i, k, ifrom, nextl, nsuper;
int ito;
int krow, kmark, mem_error;
int *supno, *lsub, *xlsub, *xlsub_end;
supno = Glu->supno;
xlsub = Glu->xlsub;
xlsub_end = Glu->xlsub_end;
nsuper = NewNsuper(pnum, &pxgstrf_shared->lu_locks[NSUPER_LOCK],
&Glu->nsuper);
Glu->xsup[nsuper] = jcol;
Glu->xsup_end[nsuper] = kcol + 1;
nextl = 0;
for (i = jcol; i <= kcol; i++) {
/* for each nonzero in A[*,i] */
for (k = xa_begin[i]; k < xa_end[i]; k++) {
krow = asub[k];
kmark = marker[krow];
if ( kmark != kcol ) { /* First time visit krow */
marker[krow] = kcol;
col_lsub[nextl++] = krow;
}
}
supno[i] = nsuper;
}
if ( (mem_error = Glu_alloc(pnum, jcol, 2*nextl, LSUB, &ito,
pxgstrf_shared)) )
return mem_error;
xlsub[jcol] = ito;
lsub = Glu->lsub;
for (ifrom = 0; ifrom < nextl; ++ifrom)
lsub[ito++] = col_lsub[ifrom];
xlsub_end[jcol] = ito;
return 0;
}
syntax highlighted by Code2HTML, v. 0.9.1