⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zsnode_dfs.c

📁 SuperLU is a general purpose library for the direct solution of large, sparse, nonsymmetric systems
💻 C
字号:
/*! @file zsnode_dfs.c * \brief Determines the union of row structures of columns within the relaxed node * * <pre> * -- SuperLU routine (version 2.0) -- * Univ. of California Berkeley, Xerox Palo Alto Research Center, * and Lawrence Berkeley National Lab. * November 15, 1997 * * Copyright (c) 1994 by Xerox Corporation.  All rights reserved. * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY * EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK. *  * Permission is hereby granted to use or copy this program for any * purpose, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is * granted, provided the above notices are retained, and a notice that * the code was modified is included with the above copyright notice. * </pre> */#include "slu_zdefs.h"/*! \brief * * <pre> * Purpose * ======= *    zsnode_dfs() - Determine 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. * </pre> */intzsnode_dfs (	   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 */	   GlobalLU_t *Glu          /* modified */	   ){    register int i, k, ifrom, ito, nextl, new_next;    int          nsuper, krow, kmark, mem_error;    int          *xsup, *supno;    int          *lsub, *xlsub;    int          nzlmax;        xsup    = Glu->xsup;    supno   = Glu->supno;    lsub    = Glu->lsub;    xlsub   = Glu->xlsub;    nzlmax  = Glu->nzlmax;    nsuper = ++supno[jcol];	/* Next available supernode number */    nextl = xlsub[jcol];    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;		lsub[nextl++] = krow;		if ( nextl >= nzlmax ) {		    if ( mem_error = zLUMemXpand(jcol, nextl, LSUB, &nzlmax, Glu) )			return (mem_error);		    lsub = Glu->lsub;		}	    }    	}	supno[i] = nsuper;    }    /* Supernode > 1, then make a copy of the subscripts for pruning */    if ( jcol < kcol ) {	new_next = nextl + (nextl - xlsub[jcol]);	while ( new_next > nzlmax ) {	    if ( mem_error = zLUMemXpand(jcol, nextl, LSUB, &nzlmax, Glu) )		return (mem_error);	    lsub = Glu->lsub;	}	ito = nextl;	for (ifrom = xlsub[jcol]; ifrom < nextl; )	    lsub[ito++] = lsub[ifrom++];	        for (i = jcol+1; i <= kcol; i++) xlsub[i] = nextl;	nextl = ito;    }    xsup[nsuper+1] = kcol + 1;    supno[kcol+1]  = nsuper;    xprune[kcol]   = nextl;    xlsub[kcol+1]  = nextl;    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -