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

📄 slu_util.h

📁 LU矩阵分解单机版最新版本
💻 H
字号:
#ifndef __SUPERLU_UTIL /* allow multiple inclusions */#define __SUPERLU_UTIL#include <stdio.h>#include <stdlib.h>#include <string.h>/*#ifndef __STDC__#include <malloc.h>#endif*/#include <assert.h>/*********************************************************************** * Macros ***********************************************************************/#define FIRSTCOL_OF_SNODE(i)	(xsup[i])/* No of marker arrays used in the symbolic factorization,   each of size n */#define NO_MARKER     3#define NUM_TEMPV(m,w,t,b)  ( SUPERLU_MAX(m, (t + b)*w) )#ifndef USER_ABORT#define USER_ABORT(msg) superlu_abort_and_exit(msg)#endif#define ABORT(err_msg) \ { char msg[256];\   sprintf(msg,"%s at line %d in file %s\n",err_msg,__LINE__, __FILE__);\   USER_ABORT(msg); }#ifndef USER_MALLOC#if 1#define USER_MALLOC(size) superlu_malloc(size)#else/* The following may check out some uninitialized data */#define USER_MALLOC(size) memset (superlu_malloc(size), '\x0F', size)#endif#endif#define SUPERLU_MALLOC(size) USER_MALLOC(size)#ifndef USER_FREE#define USER_FREE(addr) superlu_free(addr)#endif#define SUPERLU_FREE(addr) USER_FREE(addr)#define CHECK_MALLOC(where) {                 \    extern int superlu_malloc_total;        \    printf("%s: malloc_total %d Bytes\n",     \	   where, superlu_malloc_total); \}#define SUPERLU_MAX(x, y) 	( (x) > (y) ? (x) : (y) )#define SUPERLU_MIN(x, y) 	( (x) < (y) ? (x) : (y) )/*********************************************************************** * Constants  ***********************************************************************/#define EMPTY	(-1)/*#define NO	(-1)*/#define FALSE	0#define TRUE	1/*********************************************************************** * Enumerate types ***********************************************************************/typedef enum {NO, YES}                                          yes_no_t;typedef enum {DOFACT, SamePattern, SamePattern_SameRowPerm, FACTORED} fact_t;typedef enum {NOROWPERM, LargeDiag, MY_PERMR}                   rowperm_t;typedef enum {NATURAL, MMD_ATA, MMD_AT_PLUS_A, COLAMD, MY_PERMC}colperm_t;typedef enum {NOTRANS, TRANS, CONJ}                             trans_t;typedef enum {NOEQUIL, ROW, COL, BOTH}                          DiagScale_t;typedef enum {NOREFINE, SINGLE=1, DOUBLE, EXTRA}                IterRefine_t;typedef enum {LUSUP, UCOL, LSUB, USUB}                          MemType;typedef enum {HEAD, TAIL}                                       stack_end_t;typedef enum {SYSTEM, USER}                                     LU_space_t;/*  * The following enumerate type is used by the statistics variable  * to keep track of flop count and time spent at various stages. * * Note that not all of the fields are disjoint. */typedef enum {    COLPERM, /* find a column ordering that minimizes fills */    RELAX,   /* find artificial supernodes */    ETREE,   /* compute column etree */    EQUIL,   /* equilibrate the original matrix */    FACT,    /* perform LU factorization */    RCOND,   /* estimate reciprocal condition number */    SOLVE,   /* forward and back solves */    REFINE,  /* perform iterative refinement */    TRSV,    /* fraction of FACT spent in xTRSV */    GEMV,    /* fraction of FACT spent in xGEMV */    FERR,    /* estimate error bounds after iterative refinement */    NPHASES  /* total number of phases */} PhaseType;/*********************************************************************** * Type definitions ***********************************************************************/typedef float    flops_t;typedef unsigned char Logical;/*  *-- This contains the options used to control the solve process. * * Fact   (fact_t) *        Specifies whether or not the factored form of the matrix *        A is supplied on entry, and if not, how the matrix A should *        be factorizaed. *        = DOFACT: The matrix A will be factorized from scratch, and the *             factors will be stored in L and U. *        = SamePattern: The matrix A will be factorized assuming *             that a factorization of a matrix with the same sparsity *             pattern was performed prior to this one. Therefore, this *             factorization will reuse column permutation vector  *             ScalePermstruct->perm_c and the column elimination tree *             LUstruct->etree. *        = SamePattern_SameRowPerm: The matrix A will be factorized *             assuming that a factorization of a matrix with the same *             sparsity	pattern and similar numerical values was performed *             prior to this one. Therefore, this factorization will reuse *             both row and column scaling factors R and C, both row and *             column permutation vectors perm_r and perm_c, and the *             data structure set up from the previous symbolic factorization. *        = FACTORED: On entry, L, U, perm_r and perm_c contain the  *              factored form of A. If DiagScale is not NOEQUIL, the matrix *              A has been equilibrated with scaling factors R and C. * * Equil  (yes_no_t) *        Specifies whether to equilibrate the system (scale A's row and *        columns to have unit norm). * * ColPerm (colperm_t) *        Specifies what type of column permutation to use to reduce fill. *        = NATURAL: use the natural ordering  *        = MMD_ATA: use minimum degree ordering on structure of A'*A *        = MMD_AT_PLUS_A: use minimum degree ordering on structure of A'+A *        = COLAMD: use approximate minimum degree column ordering *        = MY_PERMC: use the ordering specified in ScalePermstruct->perm_c[] *          * Trans  (trans_t) *        Specifies the form of the system of equations: *        = NOTRANS: A * X = B        (No transpose) *        = TRANS:   A**T * X = B     (Transpose) *        = CONJ:    A**H * X = B     (Transpose) * * IterRefine (IterRefine_t) *        Specifies whether to perform iterative refinement. *        = NO: no iterative refinement *        = WorkingPrec: perform iterative refinement in working precision *        = ExtraPrec: perform iterative refinement in extra precision * * PrintStat (yes_no_t) *        Specifies whether to print the solver's statistics. * * DiagPivotThresh (double, in [0.0, 1.0]) (only for sequential SuperLU) *        Specifies the threshold used for a diagonal entry to be an *        acceptable pivot. * * PivotGrowth (yes_no_t) *        Specifies whether to compute the reciprocal pivot growth. * * ConditionNumber (ues_no_t) *        Specifies whether to compute the reciprocal condition number. * * RowPerm (rowperm_t) (only for SuperLU_DIST) *        Specifies whether to permute rows of the original matrix. *        = NO: not to permute the rows *        = LargeDiag: make the diagonal large relative to the off-diagonal *        = MY_PERMR: use the permutation given in ScalePermstruct->perm_r[] *            * ReplaceTinyPivot (yes_no_t) (only for SuperLU_DIST) *        Specifies whether to replace the tiny diagonals by *        sqrt(epsilon)*||A|| during LU factorization. * * SolveInitialized (yes_no_t) (only for SuperLU_DIST) *        Specifies whether the initialization has been performed to the *        triangular solve. * * RefineInitialized (yes_no_t) (only for SuperLU_DIST) *        Specifies whether the initialization has been performed to the *        sparse matrix-vector multiplication routine needed in iterative *        refinement. */typedef struct {    fact_t        Fact;    yes_no_t      Equil;    colperm_t     ColPerm;    trans_t       Trans;    IterRefine_t  IterRefine;    yes_no_t      PrintStat;    yes_no_t      SymmetricMode;    double        DiagPivotThresh;    yes_no_t      PivotGrowth;    yes_no_t      ConditionNumber;    rowperm_t     RowPerm;    yes_no_t      ReplaceTinyPivot;    yes_no_t      SolveInitialized;    yes_no_t      RefineInitialized;} superlu_options_t;typedef struct {    int     *panel_histo; /* histogram of panel size distribution */    double  *utime;       /* running time at various phases */    flops_t *ops;         /* operation count at various phases */    int     TinyPivots;   /* number of tiny pivots */    int     RefineSteps;  /* number of iterative refinement steps */} SuperLUStat_t;/*********************************************************************** * Prototypes ***********************************************************************/#ifdef __cplusplusextern "C" {#endifextern void    Destroy_SuperMatrix_Store(SuperMatrix *);extern void    Destroy_CompCol_Matrix(SuperMatrix *);extern void    Destroy_CompRow_Matrix(SuperMatrix *);extern void    Destroy_SuperNode_Matrix(SuperMatrix *);extern void    Destroy_CompCol_Permuted(SuperMatrix *);extern void    Destroy_Dense_Matrix(SuperMatrix *);extern void    get_perm_c(int, SuperMatrix *, int *);extern void    set_default_options(superlu_options_t *options);extern void    sp_preorder (superlu_options_t *, SuperMatrix*, int*, int*,			    SuperMatrix*);extern void    superlu_abort_and_exit(char*);extern void    *superlu_malloc (size_t);extern int     *intMalloc (int);extern int     *intCalloc (int);extern void    superlu_free (void*);extern void    SetIWork (int, int, int, int *, int **, int **, int **,                         int **, int **, int **, int **);extern int     sp_coletree (int *, int *, int *, int, int, int *);extern void    relax_snode (const int, int *, const int, int *, int *);extern void    heap_relax_snode (const int, int *, const int, int *, int *);extern void    resetrep_col (const int, const int *, int *);extern int     spcoletree (int *, int *, int *, int, int, int *);extern int     *TreePostorder (int, int *);extern double  SuperLU_timer_ ();extern int     sp_ienv (int);extern int     lsame_ (char *, char *);extern int     xerbla_ (char *, int *);extern void    ifill (int *, int, int);extern void    snode_profile (int, int *);extern void    super_stats (int, int *);extern void    PrintSumm (char *, int, int, int);extern void    StatInit(SuperLUStat_t *);extern void    StatPrint (SuperLUStat_t *);extern void    StatFree(SuperLUStat_t *);extern void    print_panel_seg(int, int, int, int, int *, int *);extern void    check_repfnz(int, int, int, int *);#ifdef __cplusplus  }#endif#endif /* __SUPERLU_UTIL */

⌨️ 快捷键说明

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